Разница заключается в том контексте, в котором находится событие l oop при разрешении обещания (resolve(1)
).
Есть 2 очереди, которые выполняют код в JS:
- микрозадача Q
- макрозадача Q
JS выполняет микрозадачу и затем запускает все задачи из макрозадачи Q (если есть)
При разрешении обещания из executor
(Promise (...)), который вы выполняете внутри macrotask Q. Код, выполняемый из обратного вызова обещания, выполняется в microtask Q .
Разница, которая имеет значение в этом случае, состоит в том, что при запуске изнутри микрозадачи Q, если вы добавляете другие микрозадачи (обратные вызовы обещаний являются микрозадачами), они добавляются к текущему Q и обрабатываются во время выполнения этой очереди.
Это то, что происходит в случае № 2, вы решаете обещание изнутри микрозадачи Q, это в конечном итоге разрешает верхний уровень Promise
и добавляет .then(data => { log(data); });
к текущая микрозадача Q . Таким образом, обратный вызов будет выполнен в этом запуске. С другой стороны, обработчики вложенного обещания Promise.resolve()
не выполняются , теперь , так как обработчики всегда называются asyn c.
Примечание: можно добавить микрозадачи. бесконечность изнутри микрозадачи Q, блокирующей выполнение.