Задать вопрос
@Drovosek01

Чем асинхронность отличается от однопоточности в Javascript?

Доброго времени суток.

Перечитал уже много статей про асинхронность в js и её понимание, но никак не могу понять что это такое.

В подавляющем большинстве ресурсов, которые я изучил приводится пример с использованием setTimeout и Промисов (но я с ними еще не начал разбираться "вплотную").

Как я понял, setTimeout начинают выполнение переданного в них кода (т.е. кода внутри переданной в них callback функции) после того, как выполнится весь другой код, не связанный с setTimeout'ами и после этого callback'и из setTimeout'ов попадают в стэк вызовов в зависимости от того, какие у них были выставлены задержки.

Вопрос: как нам это помогает победить выполнение кода последовательно в один поток, если это просто смещение выполнение кода по времени? Т.е. это просто переносит выполнение кода на будущее.

Возможно я не так понимаю что из себя представляет ассинхронность в js. На мой взгляд это когда можно, например, скачивать из js кода 2 и более файлов одновременно или одновременно решать 2 и более не связанных между собой математических уравнения, а не последовательно как это делает js.
И ведь если скачивание файлов или решение уравнений раскидать по разным setTimeout с минимальными задержками, они ведь не будут решаться параллельно, а просто выстроятся в последовательную очередь только после определенной задержки.

P.S.
Пожалуйста, не кидайте мне ссылки на статьи, где примеры с setTimeout. Вот последнее, что я прочитал и заданный вопрос не решился:
  • Вопрос задан
  • 198 просмотров
Подписаться 1 Средний 1 комментарий
Ответ пользователя Rsa97 К ответам на вопрос (2)
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Асинхронность помогает единственному основному потоку не висеть в ожидании завершения какой-либо длительной внешней, по отношению к потоку, операции или наступления некоего события.
Представьте, что у вас всё работает синхронно. Тогда, если вы в фоне подгружаете какие-либо данные, то основной поток будет ждать завершения их загрузки и браузер перестанет реагировать на любые действия пользователя - нажатия на клавиши, движения мыши и т.п.
При асинхронности есть некая очередь. Любое событие (нажатие клавиши, движение мыши, скролл, завершение сетевой операции, срабатывание таймера) добавляет в эту очередь новую задачу. Браузер берёт задачи из этой очереди и выполняет их в единственном потоке. Эти задачи могут порождать процессы во вспомогательных потоках (инициация таймера, запуск сетевого процесса), которые в конце работы добавят новые задачи в очередь.
И таки да, если из задачи запустить несколько сетевых операций подряд, то они будут работать одновременно во вспомогательных потоках, при этом каждая такая операция при своём завершении добавит новую задачу в очередь. То же самое и с таймерами, все таймеры ведут отсчёт одновременно, добавляя задачи в очередь по истечению заданного времени.

Аналогия: представьте, что вы начальник и к вам стоит очередь подчинённых. Каждому из них вы даёте задание и он уходит это задание выполнять.
Синхронный процесс - вы ожидаете возвращения подчинённого и его доклада о выполнении задачи, затем даёте ему новое задание и так, пока задания для него не закончатся. Потом переходите к следующему подчинённому.
Асинхронный - вы даёте задачу, подчинённый уходит, вы даёте задание следующему и т.д. По выполнению задачи вернувшийся подчинённый встаёт в общую очередь к вам.
Ответ написан