Использование setTimeout без значения тайм-аута при оценке результата Promise.all - PullRequest
0 голосов
/ 27 сентября 2018

Документы Promise.all MDN содержат пример оценки нескольких результатов Promise.all, но внутри функции setTimeout без значения времени ожидания.

Из документов:

// this will be counted as if the iterable passed is empty, so it gets fulfilled
var p = Promise.all([1,2,3]);
// this will be counted as if the iterable passed contains only the resolved promise with value "444", so it gets fulfilled
var p2 = Promise.all([1,2,3, Promise.resolve(444)]);
// this will be counted as if the iterable passed contains only the rejected promise with value "555", so it gets rejected
var p3 = Promise.all([1,2,3, Promise.reject(555)]);

// using setTimeout we can execute code after the stack is empty
setTimeout(function() {
    console.log(p);
    console.log(p2);
    console.log(p3);
});

// logs
// Promise { <state>: "fulfilled", <value>: Array[3] }
// Promise { <state>: "fulfilled", <value>: Array[4] }
// Promise { <state>: "rejected", <reason>: 555 }

Может кто-нибудь помочь объяснить, чего это добивается, с помощью нескольких слов, превышающих комментарий в коде?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

setTimeout, вызываемый без значения задержки, просто помещает переданную функцию в очередь для выполнения циклом событий JavaScript .Обычно это следующий тик, хотя в очереди могут быть и другие запланированные события, поэтому функция будет после них.

Разрешение Promise назначается аналогичным образом, помещая его в очередь.Это означает, что setTimeout будет планировать завершение функции немедленно после завершения обещаний.В свою очередь это означает, что значения p, p2 и p3 будут ожидающими в текущем цикле цикла событий JavaScript, а затем в конечном состоянии, когда вызывается функция, задержанная на setTimeout.

Демонстрация хода выполнения программы:

//console.logs from StackOverflow snippets don't print the state of the promise
//you can open the browser developer tools and click the button to run the snippet
//in order to see that output

var p = Promise.all([1,2,3]); //<-- a pending promise is created
p.finally(() => console.log("promise fulfilled", p));

console.log("this call is executed immediately", p); //<-- the same run of the event loop

setTimeout(function() {
    console.log("this call is scheduled to execute in the future", p); //<-- to be executed in a subsequent run of the loop.
});
0 голосов
/ 27 сентября 2018

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

...