Что происходит в первую очередь: setTimeout 0 или ожидают Promise.resolve? - PullRequest
0 голосов
/ 10 января 2019

Я вижу это поведение в 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
])

Ответы [ 4 ]

0 голосов
/ 10 января 2019

Нет гарантии, что один будет раньше другого. Если вы хотите гарантировать порядок исполнения - используйте Обещания.

0 голосов
/ 10 января 2019

Таким образом, у вас есть 2 асинхронных состояния ожидания, но обратите внимание, что одно из них является постоянным, а другое изменяется (переменным). Тайм-аут устанавливается в переменной XML, в то время как обещание может длиться вечно. Если я понимаю ваш вопрос достаточно хорошо, когда у вас есть что-то, на что вы полагаетесь, занимает слишком много времени и что-то слишком короткое, если к одному из них не применяется постоянное значение, например время ожидания, тогда вы можете неожиданно бежать короче (!) Будьте готовы для этого и вместо этого используйте монолитную структуру из соображений безопасности кода, а не производительности.

0 голосов
/ 10 января 2019

Promise.resolve будет планировать микрозадачу, а setTimeout - макрозадачу. И микрозадачи будут выполняться до запуска следующей макрозадачи.

Дополнительная информация о цикле событий в целом: https://www.youtube.com/watch?v=8aGhZQkoFbQ

Дополнительные технические подробности о цикле событий: https://www.youtube.com/watch?v=cCOL7MC4Pl0

0 голосов
/ 10 января 2019

Насколько я понимаю, Promise имеет более высокий приоритет в стеке вызовов, чем setTimeout, и, конечно, синхронный кодовый блок будет выполняться первым. В этом случае да, наблюдаемое выше поведение (в порядке блока синхронного кода, promise.resolve и setTimeout 0) должно быть согласованным.

...