Promise链 #力扣Day4

54 阅读2分钟

什么是Promise

如何直观地理解Promise?

在油管上看到一个比较有趣的类比,可以把Promise看成是用手机打车的过程。

当司机收到新的订单时,一个新的Promise就创建了,此时乘客将在上车点等待司机,当司机到达或者临时取消订单时,司机会通过resolve或者reject来告知乘客,此时Promise就完成了,乘客可以上车(调用then函数)。

var callDriver = new Promise(function(resolve, reject) {//呼叫司机

  setTimeout(() => resolve('抵达上车点'), 1000);//司机正在前往上车点的路上,耗时1000ms

}).then(function(result) {//收到司机的抵达信息

  alert(result); // 抵达上车点

})

Promise链

通过Promise链可以实现一个接一个地执行异步任务。

then处理程序返回一个普通值时,它将成为该 promise 的 result,所以将使用它调用下一个 .then

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对象,来构建异步行为链

new Promise(function(resolve, reject) {

  setTimeout(() => resolve(1), 1000);

}).then(function(result) {

  alert(result); // 1

  return new Promise((resolve, reject) => { // (*)
    setTimeout(() => resolve(result * 2), 1000);
  });

}).then(function(result) { // (**)

  alert(result); // 2

  return new Promise((resolve, reject) => {
    setTimeout(() => resolve(result * 2), 1000);
  });

}).then(function(result) {

  alert(result); // 4

});

此时第一个then返回的Promise对象的resolve值在完成执行器函数(这里指setTimeout)后可以传递给下一个then,下一个then继续返回一个新的Promise,依次类推,此时输出与前面的示例相同:1 → 2 → 4,但是现在每次 alert 调用之间会有 1 秒钟的延迟,从而实现带有异步效果的Promise链。

查看更多细节可传送至:zh.javascript.info/promise-cha…