Как Javascript ES6 включает примитивные асинхронные промисы, если JS однопоточный?

Я думаю, что понимаю природу асинхронности и синхронизации. Я также понимаю, что javascript включает в себя определенные асинхронные функции, такие как setTimeout, которые могут работать, потому что они используют какой-то веб-API. Я также понимаю, что вы можете давать обещания, используя внешние библиотеки, такие как bluebird. Все это имеет смысл.

Однако, если промисы являются асинхронными, а ES6 включает в себя примитивные объекты промисов, то как это возможно, если JS является однопоточным?

Я полагаю, что либо: 1. JS не является чисто однопоточным 2. Обещания не являются асинхронными 3. Примитивные обещания используют веб-API (или какой-то API, предоставляемый средой)

Или ни один из трех вышеперечисленных? Оцените подробное объяснение.


person Aljosha Novakovic    schedule 11.02.2017    source источник
comment
@ jfriend00 Я видел этот вопрос, который вы пометили как дубликат. Я продолжал публиковать вопрос, потому что чувствую, что мне и многим другим будет полезен четкий ответ. Верхний ответ в этой ссылке противоречит первому комментарию (как и другим).   -  person Aljosha Novakovic    schedule 11.02.2017
comment
Обещания вообще не используют потоки. Это просто инструмент для управления завершением уже существующих асинхронных операций, которые могут использовать или не использовать собственные потоки в своей реализации. Кроме того, обещания не выполняются. Они просто инструмент мониторинга. Выполняются асинхронные операции. Promises просто следит за этими операциями. Как насчет этого вопроса нет ответа в том другом. Обещания не используют потоки. Обещания сами по себе являются даже асинхронными операциями. Это инструмент, используемый в качестве прокси для фактической асинхронной операции.   -  person jfriend00    schedule 11.02.2017
comment
@ jfriend00 На самом деле Promise.resolve("World").then(console.log); console.log("Hello") сам по себе асинхронен. Это больше похоже на № 3 — промисы используют тот же асинхронный интерфейс среды, что и веб-API.   -  person Bergi    schedule 11.02.2017
comment
Кстати, Bluebird не является какой-либо внешней библиотекой, она написана на JS и использует веб-API, например setTimeout, для обеспечения асинхронности своих обещаний.   -  person Bergi    schedule 11.02.2017
comment
@AljoshaNovakovic Почему вы думаете, что однопоточность и асинхронность исключают друг друга?   -  person Bergi    schedule 11.02.2017
comment
Возможно, это поможет понять, как работает JS: developer.mozilla.org/en -US/docs/Web/JavaScript/EventLoop   -  person Felix Kling    schedule 11.02.2017