Что происходит, когда мы возвращаем значение и когда мы возвращаем Promise.resolve из цепочки then (), в очереди микропроцессоров? - PullRequest
0 голосов
/ 29 марта 2020

Здесь у меня есть обещание, которое просто выполнено.

let promise = new Promise((resolve,reject)=>{
    resolve("resolved");
});

Путаница для меня начинается, когда я использую Promise для возвращаемого значения в цепочке .then, например:

promise.then(resolve=>{
    console.log(resolve);
    return Promise.resolve(2);
}).then(resolve=>{
    console.log(resolve);
});

promise.then(resolve=>{
    console.log(resolve)
    return 3;
}).then(resolve=>{
    console.log(resolve);
});

Вывод этих цепочек: 1 1 3 2 Что я ожидал увидеть: 1 1 2 3

Но если я поверну return Promise.resolve(2); на return 2, как здесь:

promise.then(resolve=>{
    console.log(resolve);
    return 2;
}).then(resolve=>{
    console.log(resolve);
});

promise.then(resolve=>{
    console.log(resolve)
    return 3;
}).then(resolve=>{
    console.log(resolve);
});

Я получу вывод, который мне показался получил бы в первую очередь (1 1 2 3).

Так может ли кто-нибудь здесь объяснить, почему выходные данные меняются в зависимости от использования и не использования Promise.resolve()?

Кстати, я задаю этот вопрос только по чистой причине ACADEMI C!

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Поскольку вы возвращаете новое Обещание в случае 1, оно будет решено в следующем tick.

Каждый раз при поиске микро-задачи Q решаются обещания, находящиеся в Q (не только обещания, но это актуально для этого вопроса). В случае 1 вы получаете разрешение Promise.resolve(2), а разрешение resolve=>{ console.log(resolve) return 3; }.

Теперь у следующего микро Q есть обещание включения Promise.resolve(2) на Q. Это добавляет задержку между двумя случаями.

1 голос
/ 29 марта 2020

Обещания then разрешаются во время микрозадачи. Внутри .then, если вы вернете простое значение, такое как 2 или 3, следующее .then, прикованное к нему, будет выполнено в следующий раз, когда стек вызовов очистится. Но если вы возвращаете обещание, его нужно сначала развернуть, прежде чем переходить к следующему .then.

В вашем первом коде, когда стек вызовов очищен, запускаются первые микрозадачи. Один из них «разворачивает» Promise.resolve(2) и ставит в очередь обратный вызов .then в очереди для микрозадач. Напротив, 3 не нужно разворачивать, поэтому его .then запускается немедленно в этой точке, без необходимости ждать, записывая 3.

В этом случае главной задачей очереди для микрозадач является 2 s .then, ведение журнала 2.

Все это говорит о том, что в реальном коде вам не нужно полагаться на такой тип синхронизации, поскольку это немного сбивает с толку - если это проблема, лучше всего реструктурировать код, чтобы не о чем беспокоиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...