如何使用bluebirdjs顺序链接承诺?

时间:2014-08-16 08:23:03

标签: javascript promise chaining chain bluebird

Promise.all()并不保证承诺将按顺序得到解决。怎么办呢?

2 个答案:

答案 0 :(得分:8)

由于您正在使用Bluebird JS,这实际上可以通过简单的方式完成。

在2.0版本中,Bluebird引入了Promise.each方法来执行此操作,因为循环a非常简单,但由于它非常常见并且一次又一次地请求,最终它被添加为自己的方法。 / p>

function foo(item, ms){ // note bluebird has a delay method
    return Promise.delay(ms, item).then(console.log.bind(console))
}

var items = ['one', 'two', 'three'];

Promise.each(items, function(item, i){
    return foo(item, (items.length - i) * 1000)
});

与其他答案产生的结果相同,只有较少的代码行,并且Bluebird还可以对迭代执行优化。

答案 1 :(得分:0)

最让我困惑的是,链接的异步函数需要返回一个返回promise的函数。这是一个例子:

function setTimeoutPromise(ms) {
  return new Promise(function (resolve) {
    setTimeout(resolve, ms);
  });
}

function foo(item, ms) {
  return function() {
    return setTimeoutPromise(ms).then(function () {
      console.log(item);
    });
  };
}

var items = ['one', 'two', 'three'];

function bar() {
  var chain = Promise.resolve();
  items.forEach(function (el, i) {
    chain = chain.then(foo(el, (items.length - i)*1000));
  });
  return chain;
}

bar().then(function () {
  console.log('done');
});

请注意,foo返回一个返回promise的函数。 foo()直接返回承诺。

请参阅此Live Demo