Promise 通常被定義為最終将可用的值的代理(proxy)。
問題背景
回調:我們有一系列異步任務要一個接一個地執行——例如,加載腳本。 我們怎樣才能很好地編碼呢?
Promise 提供了一些方法來做到這一點:Promise 鍊。
它看起來像這樣:
new Promise(function(resolve,) {
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 處理程式鍊傳遞。
其流程是:
- 初始 promise 在 1 秒内 resolve (*)
- 然後調用 .then 處理程式,then 方法傳回一個新建立的 Promise(以 2 值解析)。
-
下一個 then 擷取前一個的結果,對其進行處理(加倍)并将其傳遞給下一個處理程式。
以此類推。
切記,每次調用
.then
都會傳回一個新的 Promise,這樣我們就可以調用下一個
.then
了。
當處理程式傳回一個值時,它成為該 Promise 的結果,是以下一個 .then 被調用。
初學者經常犯的錯誤,對
同一個
promise 對象反複調用 then 方法。這并不是 Promise 的鍊式調用。
let promise = new Promise(function(resolve,) {
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 的幾個處理程式。 他們不會将結果傳遞給對方; 相反,他們獨立處理它。