Асинхронный + ожидание = синхронизация?

По логике, асинхронные операции должны быть неблокирующими. Javascript однопоточный. Следовательно, выполнение нескольких одновременных операций невозможно. Веб-воркеры позволяют создавать виртуализированный поток поверх основного. Но они где-то ограничены по сравнению с реальной концепцией многопоточности. Сравнивать их было бы похоже на яблоки с апельсинами.

Хотя, если вы хотите сравнить, вы можете сравнить концепцию async / await с PIC (Programable Interrupt Controller) в микропроцессорах на более высокой стороне.

Что такое PIC и почему async / await похож на него?

По сути, то, что делает PIC, заключается в том, что во время выполнения задачи микропроцессором может быть много других задач (с приоритетом), для выполнения которых может потребоваться время процессора и пропускная способность. PIC обрабатывает их и просит процессор остановить текущую задачу и выполнить задачу, которая возникла как прерывание. После этого можно продолжить с того места, где оно осталось.

Что происходит внутри асинхронной функции

Нечто подобное происходит с асинхронными функциями. Когда достигается ожидание, механизм определяет, что это выражение требует продолжения, поскольку оно выполняется в данный момент. Он подписывает виртуальное соглашение (приоритет) о том, что он вернется обратно, как только выражение ожидания будет завершено, и продолжит работу после этого. После подписания соглашения он возвращается к вызывающей функции, в которой была вызвана асинхронная функция. В тот момент, когда выражение ожидания завершит свою задачу (например, получение данных). Основной поток останавливает текущую задачу и продолжает выполнение задач после ожидания, пока все задачи в функции async не будут завершены. Как только эти задачи будут завершены, он продолжит работу с того места, где был оставлен.

Это позволяет JavaScript не позволять основному потоку оставаться пустым в любой момент. У него всегда есть те или иные задачи, которые нужно выполнить. Он будет простаивать только тогда, когда все задачи будут выполнены.

Вывод

Сказав это, мы заключаем, что асинхронная функция не блокирует выполнение функции.

Следовательно, async + await! = Sync.