Комментарии 6
Асинхронность и колбэки в JavaScript всего лишь дают возможность отложить выполнение вызова и выполнить его в порядке очереди с учетом приоритетов.
Существует среда выполнения кода, чаще всего это V8. Именно среда выполнения может реализовывать разделение задач на разные потоки (например, разные вкладки), но это не относится к самому JavaScript как языку. Если вы хотите реализовать многопоточность, то можете обратиться к веб-воркерам.
Было бы интересней если бы вы рассказали про современные реализации многопоточности, а не пересказывали чужой труд или документацию по EventLoop
Один понятный ад заменили на другой, непонятный 🙂...
Как в последнем примере функции запустились одновременно? Если первая функция закинулась в калл стэк, выполнилась(обратилась к апи браузера для создания таймера), вышла из стэка, и закинулась другая.
Тут есть прям красота:
Кроме того, при параллельных запросах к одним и тем же данным нередко возникает «состояние гонки» (race condition), когда несколько задач пытаются одновременно изменить одни и те же данные, а результат зависит от того, какая задача завершится первой.
Автор сначала приводит формулировки параллельных, одновременно, а потом в след абзаце пишет про очередность.
Или еще красота:
В асинхронном JavaScript это связано с тем, что задачи выполняются параллельно в очереди задач, но движок JavaScript обрабатывает их последовательно.
Как это, «параллельно в очереди» 😂
Спасибо за замечание! Формулировки действительно могли показаться противоречивыми. В случае «состояния гонки» (race condition) речь идёт не о буквальном одновременном выполнении задач, а о возможных конфликтах при доступе к одним и тем же данным, когда завершение задач зависит от их порядка. Это важно учитывать в асинхронных системах. Что касается «параллельно в очереди задач», то речь идёт о том, что задачи могут быть инициированы одновременно, но их выполнение в движке JavaScript происходит строго последовательно в рамках одного потока. Условная параллельность здесь описывает именно одновременное нахождение задач в очереди, а не их реальное параллельное выполнение.
Спасибо за вопрос! В статье в целом параллельность идёт условная. Первая функция выполняется, создаёт таймер через API браузера и выходит из стека вызовов, освобождая место для следующей задачи. Тем временем таймер попадает в очередь задач. Когда основной поток освобождается, задачи из этой очереди начинают выполняться. В результате создаётся впечатление одновременного выполнения, хотя на самом деле задачи запускаются последовательно, но их завершение может пересекаться. Это связано с особенностями работы цикла событий.
Как работать с потоками в JavaScript: оптимизация асинхронных запросов