@ Pointy (в комментариях) правильно, но только для его формализации:
Тело обещания, сообщения и цикл событий
Любой код, который выполняется в телеиз двух Promises
будут выполняться как сообщения в главном цикле JavaScript Event Loop .
JavaScript запускает по одному сообщению за раз, и как только сообщение выполняется в основном цикле событий, он будет выполнить до завершения до того, как что-либо еще произойдет:
... его нельзя прервать и он будет работать полностью до запуска любого другого кода (и может изменять данные, которыми манипулирует функция).
Вызывает как setTimeout
очередь messages
для основного цикла событий, поэтому работа, выполняемая в теле двух Promises
, может охватывать несколько сообщений, но каждое сообщение выполняется по одномувремя и выполнение до завершения, прежде чем что-либо еще выполнится.
Таким образом, в то время, когда каждое тело обещания достигает этой строки:
resolve(arr.shift())
... это будет текущее запущенное сообщение и "не можетбыть упрежденным и будет работать полностью передвыполняется любой другой код ".
Обратные вызовы Promise и очередь PromiseJobs
Когда Promise
разрешается, любые обратные вызовы, ожидающие на Promise
, ставятся в очередь в Очередь PromiseJobs , которая представляет собой специальную очередь заданий, представленную в ES6.
Обратные вызовы в очереди PromiseJobs запускаются после завершения текущего сообщения и до начала следующего сообщения и запускаются по одному за раз, по порядку, пока очередь не опустеет.
Итак ... есть ли вероятность того, что promiseA и promessB будут разрешены со значением 2?
Нет.Существует нулевая вероятность того, что оба значения Promises
разрешатся со значением 2
.
Эта строка:
resolve(arr.shift())
... является синхронной, и операция массива и resolve
оба будут выполняться до конца как часть текущего запущенного сообщения перед выполнением любого другого кода.
Это означает, что каждый обратный вызов handler
гарантированно ставится в очередь в PromiseJobs с уникальным значением.
Бонус
При написании кода handler
гарантированно ставится в очередь в PromiseJobs сначала с 2
, а затем в очереди в PromiseJobs с 3
впоследствии независимо от того, какой Promise
разрешает сначала , поэтому обратные вызовы handler
гарантированно будут выполняться в таком порядке, и приведенный выше код будет всегда печатать 2
до того, как он напечатает 3
.