Как понять этот порядок выполнения Promise?

Как понять этот порядок выполнения Promise?

Обещания асинхронны. Это означает, что каждый раз, когда вы создаете новое обещание, начинается новая асинхронная операция.

Что такое асинхронная операция в JS? Прежде всего вы должны понимать, что JS работает с одним потоком независимо от того, что вы делаете. Итак, чтобы сделать его похожим на асинхронный, есть нечто, называемое «цикл обработки событий» (взяло ссылку от комментария к оригинальному сообщению, tnx @Taki — отличный источник).

В общем, цикл обработки событий сохраняет все асинхронные функции и «проскальзывает» в действиях между основными действиями кода. Это действительно упрощенное объяснение, обратитесь к ссылке, чтобы узнать больше, но в этом суть.

Таким образом, в основном, здесь нет очереди «FIFO» — порядок асинхронных функций буквально зависит от таких вещей, как скорость вашего процессора, ваша операционная система и т. Д.

НО — есть способ убедиться, что одно асинхронное действие выполняется только после завершения другого, и это предложение .then . Дело в том, что он только гарантирует, что определенная функция внутри .then будет выполнена после конкретного обещания, к которому он был присоединен, но ничего не говорит о порядке его выполнения в отношении других асинхронных операций (обещаний) в цикле событий. , Так, например, в вашем коде:

 new Promise(resolve ={amp}gt; { resolve() // PROMISE A }) .then(() ={amp}gt; { new Promise(resolve ={amp}gt; { resolve() // PROMISE B }) .then(() ={amp}gt; { console.log(1) //PROMISE C }) .then(() ={amp}gt; { console.log(2) }) .then(() ={amp}gt; { console.log(3.1) }) }) .then(() ={amp}gt; { console.log(1.1) // PROMISE D new Promise((resolve ={amp}gt; { resolve() })) 

Я принял участие, чтобы объяснить:

Итак, Promise A разрешается первым. это гарантирует, что обещание B разрешится сейчас. вот когда все усложняется: поскольку обещание B разрешено, оба обещания C и D теперь попадают в цикл обработки событий! Почему? потому что у Promise A было 2 предложения .then , поэтому, когда первый цикл завершения события принимает 2-й, который является обещанием D., но у первого предложения .then было также собственное предложение .then — обещание C, которое также входит в цикл событий.

НЕТ СВЯЗИ МЕЖДУ ОБЕЩАНИЕМ D И C ! Они могут быть выполнены в любом порядке. сохраните эту логику, и вы увидите, как это работает для остальных обещаний, а также, если вы попытаетесь запустить его на другой ОС, возможно, порядок обещаний будет другим из-за разных реализаций ОС для цикла обработки событий. ,

Надеюсь, это поможет вам немного понять.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : У меня не так много опыта в JS, но обещания действительно заинтриговали меня, поэтому я провел глубокое исследование об этом. Я стою за всем, что я здесь написал, но если есть какие-то исправления в моем объяснении, я хотел бы услышать!

РЕДАКТИРОВАТЬ

Ответ подо мной также является правильным, но без объяснения, поэтому позвольте мне добавить к нему: если вы не возвращаете ничего внутри обещания (или предложение .then , которое также возвращает обещание), оно неявно возвращает разрешенное обещание с нет значения перед выходом из обещания, в основном, например, добавление return new Promise.resolve() после console.log в обещании C, например. Когда все будет выполнено так, все предложения .then следующие за обещанием B, войдут в цикл обработки событий только после того, как завершился предыдущий (например, b заканчивается, поэтому C входит в цикл, затем следующий .then и т. Д.), Но между ними другие обещания или .then предложения (например, обещание D) также могут быть введены.

Но когда вы ВОЗВРАЩАЕТЕ обещание с .then предложений .then оно гарантирует, что весь блок предложений обещания затем переходит в цикл обработки событий по одному, поэтому предложения .then также будут выполняться в порядке Вы хотели :)

tnx @ Евгений Сунич за добавление!

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector