Прежде всего, позвольте мне указать, что вам никогда не следует спорить о порядке выполнения независимых цепочек обещаний. Есть два асинхронных вызова, и они не зависят друг от друга, а выполняются одновременно, поэтому они должны всегда завершать sh в произвольном порядке.
Примеры игрушек, которые используют только обещания с немедленным разрешением делают этот порядок зависимым от семантики очередей микрозадач, а не от фактических асинхронных задач, что делает его чисто академическим c упражнением (результат которого может быть изменен в spe c) *. 1007 *
В любом случае, давайте проясним ваше недоразумение:
между объявлением x
и incrTwice
стек пуст, что приведет к очистке очереди микрозадач
Нет, стек становится пустым только после того, как весь код пользователя будет выполнен до завершения. В стеке все еще есть глобальный контекст выполнения элемента <script>
. Никакие микрозадачи не выполняются до тех пор, пока не будет завершен весь синхронный код (incr = …
, x = incr(3).…
и incrTwice(6)
).
Я считаю, что [код] показывает два эквивалентных способа достижения той же функциональности: первый путем объединения обещаний и второго с синтаксисом c сахаром async / await.
Не совсем так. У цепочки .then()
есть дополнительный шаг разрешения при отмене вложенности обещания incr(resp)
, возвращаемого первым обработчиком .then(…)
. Чтобы заставить его вести себя точно так же, как обещания await
ed в incrTwice
, вам нужно будет написать
incr(3).then(resp =>
incr(resp).then(resp =>
console.log(resp)
)
);
. Если вы это сделаете, вы фактически получите console
логи в порядок, в котором вы запустили две цепочки обещаний, потому что они будут выполнять одинаковое количество микрозадач, пока не будет выполнена console.log()
.
Подробнее см. Каков порядок выполнения в javascript promises , Порядок выполнения обещаний внутри обещаний , Что происходит, когда мы возвращаем значение и когда мы возвращаем Promise.resolve из цепочки then () в очереди микрозадач? , В чем разница между возвращаемыми обещаниями? , Порядок выполнения обещаний ES6 для возвращаемых значений