天天看點

JavaScript 裡的 Promise Chaining

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 擷取前一個的結果,對其進行處理(加倍)并将其傳遞給下一個處理程式。

    以此類推。

JavaScript 裡的 Promise Chaining

切記,每次調用 ​

​.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 的幾個處理程式。 他們不會将結果傳遞給對方; 相反,他們獨立處理它。

JavaScript 裡的 Promise Chaining

繼續閱讀