我想更深入地了解 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,最后打印解析值。
但是 API ref 声明如下:
"then" 返回一个新的Promise,相当于你在通过 Promise.resolve 后从 onFulfilled/onRejected 返回的值
因此,知道“then”函数究竟何时执行会很有趣?因为代码中的最后一个“then”链接到 chainPromises(),我首先想到它会在函数 chainPromises() 返回一些东西(在这种情况下是另一个Promise)之后执行。
如果是这种情况,最终“then”函数的“val”将是返回的promise。但是相反,最后的“then”一直等到第一个“then”中返回的所有Promise都已解决。这绝对是有道理的,因为通过这种方式,“then”函数可以堆叠,但我不明白这是如何完成的,因为 API 规范。并没有真正涵盖“then”返回的内容以及“then”函数的执行时间。
或者换句话说,为什么最终的“then”函数要等到所有的 Promises 在 chainPromises() 函数内被解析,而不是像 API 文档所说的那样等待第一个返回的对象。
我希望我能说清楚我的意思.. :)