Я вижу это поведение в Node и Chrome:
setTimeout(()=>{ console.log('timeout') }, 0)
Promise.resolve().then(()=>{ console.log('promise') })
console.log('sync')
// output order:
// sync
// promise
// timeout
У меня вопрос, это последовательное поведение? Т.е., в соответствии со спецификацией, всегда ли then
или await
по записанному / уже разрешенному обещанию всегда срабатывает до setTimeout(fn, 0)
?
Я хочу использовать это в следующем примере, возвращая одну вещь, если у меня есть запомненный результат в моем обещании, и другую, если нет:
// somewhere during object initialization
this.resultingPromise = expensiveAsyncFunction()
// in a method called frequently
Promise.race([
new Promise(resolve => setTimeout(() => resolve('default'), 0)),
this.resultingPromise
])