@Drovosek01

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

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

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

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

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

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

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

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

Аналогия: представьте, что вы начальник и к вам стоит очередь подчинённых. Каждому из них вы даёте задание и он уходит это задание выполнять.
Синхронный процесс - вы ожидаете возвращения подчинённого и его доклада о выполнении задачи, затем даёте ему новое задание и так, пока задания для него не закончатся. Потом переходите к следующему подчинённому.
Асинхронный - вы даёте задачу, подчинённый уходит, вы даёте задание следующему и т.д. По выполнению задачи вернувшийся подчинённый встаёт в общую очередь к вам.
Ответ написан
WblCHA
@WblCHA
Асинхронность в первую очередь нужна, когда идут запросы на сервер.
Тут, имхо, будет хороша такая аналогия:
Начальник ─ программист.
Грузчик 1шт. ─ интерепритатор жс.
Начальник ставит грузчику 2 задачи: разгрузить фуры и перетащить коробки партиями из А в Б.
На разгрузку одной фуры грузчику надо 15 минут, фуры приходят 1 раз в час, фур 5 штук, 1ая уже готова к разгрузке.
Перетащить одну партию коробок требует 5 минут, новая партия поступает сразу после доставки предыдущей, всего 50 партий.
Синхронный ─ это когда грузчик разгружает фуру каждый час, попивая чаёк с печеньками в ожидании следующей фуры, и только после того, как разгрузит все фуры, начнёт таскать коробки. На всё про всё уйдёт более 8 часов.
Асинхронный ─ это когда грузчик работает без продуху, только разгрузил фуру, сразу начал таскать коробки, приехала фура, начал разгружать её, и т.д. На всё про всё уйдёт чуть более 5 часов.

Надеюсь, логика ясна.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы