Это связано с этим изменением в спецификациях , которое теперь позволяет короткому замыканию await promiseInstance
не переносить promiseInstance
в новое Promise внутри и, следовательно, сохранять два тика (один для ждем promiseInstance
и один пробудит функцию asyn c).
Вот подробная статья от авторов патча спецификаций, которые также являются разработчиками v8. Там они объясняют, как такое поведение на самом деле уже было в nodejs v.8, но к тому времени противоречило спецификациям, то есть ошибка, которую они исправили в версии 10, до того, как этот патч сделает это официальным способом, и он реализуется непосредственно в движке v8.
Итак, если вы используете sh встроенная версия, которая должна была произойти до этого патча, будет
const p = Promise.resolve();
new Promise((res) => p.then(res)) // wait for p to resolve
.then((res) => Promise.resolve(res)) // wake up the function
.then((res) => console.log('after:await'));
p.then(() => console.log('tick:a'))
.then(() => console.log('tick:b'));
, а патч сделает это
const p = Promise.resolve();
p.then(() => console.log('after:await'));
p.then(() => console.log('tick:a'))
.then(() => console.log('tick:b'));