延迟承诺链解析

时间:2016-11-26 23:30:55

标签: javascript promise

我尝试按顺序执行promises但是时间错误......

当我执行以下代码时,我立即得到了五个回复"我是XXX,我得到了YY" 2秒后,我获得了成功"消息。

我想要的是第一个收到消息"我是XXX,我得到了YY"间隔2秒然后成功。

有什么想法吗?

"use strict";
Promise.resolve()
  .then(doStuff)
  .then(function () {
    console.log("Success");
})

function doStuff() {
  let item = [1, 2, 3, 4, 5, 6];
  // Construction du tableau de promises
  let array = item.map(i => {
    let pro =  new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve("Item " + i);
        }, 2000 );
      });
    pro.custom = i;
    return pro;
  });

  let pro = array.reduce((p, item) => {
      return p.then((val) => {
        console.log("I'm " + item.custom + " and I get " + val);
        return Date.now();
      });
  }, Promise.resolve());

  return pro;
}

(抱歉我的英语不好)。

1 个答案:

答案 0 :(得分:0)

目前,所有的延迟都是在同一时间开始的,这就是为什么他们都会立刻完成,以及为什么在doStuff和Success消息之间有一个2秒的延迟

如果按如下方式更改doStuff,则输出应相同,但数组中的项之间有2秒的延迟

function doStuff() {
  let item = [1, 2, 3, 4, 5, 6];
  let delay = timeout => new Promise(resolve => setTimeout(resolve, timeout));
  return item.reduce((p, val, i) => 
    p
    .then(() => delay(2000))
    .then(() => {
        console.log("I'm " + i + " and I get " + val);
        return Date.now();
    }), Promise.resolve());
}