|
在本章中,我们将一起学习 promise 链。
它看起来就像这样:
new Promise(function(resolve, reject) {
setTimeout(() => resolve(1), 1000); // (*)
}).then(function(result) { // (**)
alert(result); // 1
return result * 2;
}).then(function(result) { // (***)
alert(result); // 2
return result * 2;
}).then(function(result) {
alert(result); // 4
return result * 2;
});
它的想法是通过 .then 处理程序(handler)链进行传递 result。
运行流程如下:
初始 promise 在 1 秒后 resolve (*),
然后 .then 处理程序被调用 (**),它又创建了一个新的 promise(以 2 作为值 resolve)。
下一个 then (***) 得到了前一个 then 的值,对该值进行处理(*2)并将其传递给下一个处理程序。
……依此类推。
这样之所以是可行的,是因为每个对 .then 的调用都会返回了一个新的 promise,因此我们可以在其之上调用下一个 .then。
当处理程序返回一个值时,它将成为该 promise 的 result,所以将使用它调用下一个 .then。
新手常犯的一个经典错误:从技术上讲,我们也可以将多个 .then 添加到一个 promise 上。但这并不是 promise 链(chaining)。
例如:
let promise = new Promise(function(resolve, reject) {
setTimeout(() => resolve(1), 1000);
});
promise.then(function(result) {
alert(result); // 1
return result * 2;
});
promise.then(function(result) {
alert(result); // 1
return result * 2;
});
promise.then(function(result) {
alert(result); // 1
return result * 2;
});
我们在这里所做的只是一个 promise 的几个处理程序。它们不会相互传递 result;相反,它们之间彼此独立运行处理任务。
随着 result 在处理程序链中传递,我们可以看到一系列的 alert 调用:1 → 2 → 4。
|
|