Я хотел бы получить более глубокое понимание того, как Promises работает внутри. Поэтому у меня есть пример кода:
var p1 = new Promise(
function(resolve, reject) {
window.setTimeout(
function() {
resolve('res called')
}, 2000);
});
var p2 = new Promise(
function(resolve, reject) {
window.setTimeout(
function() {
resolve('res called')
},2000);
});
function chainPromises(){
return p1.then(function(val) {
console.log("p1");
return p2.then(function(val) {
console.log("p2");
return val;
});
});
}
chainPromises().then(function(val) {
console.log(val);
}
);
Здесь ссылка для выполнения этого кода.
Как и следовало ожидать, сначала p1 разрешается, потом p2, а в конце финальный затем выводит значение resolv.
Но в API ref указано следующее:
"then" returns a new promise equivalent to the value you return from
onFulfilled/onRejected after being passed through Promise.resolve
Итак, было бы интересно узнать, КОГДА именно функция "then" выполняется? Поскольку окончательное "то" в коде привязано к цепочке Promises(), я сначала подумал, что он будет выполняться после того, как функция chainPromises() вернет что-то (в этом случае другое обещание).
Если бы это было так, то "val" окончательной "then" функции было бы возвращенным обещанием. Но вместо этого окончательное "то" ждет, пока все Promises внутри первого "затем", которые возвращаются, были разрешены. Это совершенно разумно, потому что таким образом "тогда" функции могут быть сложены, но Я действительно не понимаю, как это делается, поскольку спецификация API. на самом деле не покрывает то, что "затем" возвращается и когда выполняются "то" функции.
Или, другими словами, почему конечная "then" функция ждет, пока все Promises не будут разрешены внутри функции chainPromises(), а не просто ждут первого возвращенного объекта, как говорит API-документ.
Надеюсь, я мог бы понять, что я имею в виду..:)