乐趣区

关于javascript:JavaScript-里的-Promise-Chaining

Promise 通常被定义为最终将可用的值的代理(proxy)。

问题背景

回调:咱们有一系列异步工作要一个接一个地执行——例如,加载脚本。咱们怎样才能很好地编码呢?

Promise 提供了一些办法来做到这一点: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 处理程序链传递。

其流程是:

  • 初始 promise 在 1 秒内 resolve (*)
  • 而后调用 .then 处理程序,then 办法返回一个新创建的 Promise(以 2 值解析)。
  • 下一个 then 获取前一个的后果,对其进行解决(加倍)并将其传递给下一个处理程序。
    以此类推。

切记,每次调用 .then 都会返回一个新的 Promise,这样咱们就能够调用下一个 .then 了。

当处理程序返回一个值时,它成为该 Promise 的后果,因而下一个 .then 被调用。

初学者常常犯的谬误,对 同一个 promise 对象重复调用 then 办法。这并不是 Promise 的链式调用。

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 的几个处理程序。他们不会将后果传递给对方;相同,他们独立解决它。

所有 .then 在同一个 Promise 上失去雷同的后果——那个 Promise 的后果。所以在下面的代码中所有 alert 显示雷同值:1。

在实践中,咱们很少须要多个处理程序来解决一个 Promise。chaining 调用的应用频率更高。

退出移动版