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

Javascript 如何使用bluebirdjs按顺序链接承诺?,javascript,promise,chaining,chain,bluebird,Javascript,Promise,Chaining,Chain,Bluebird,Promise.all()不能保证承诺会按顺序得到解决。如何做到这一点?最让我困惑的是,被链接的异步函数需要返回一个返回承诺的函数。下面是一个例子: function setTimeoutPromise(ms) { return new Promise(function (resolve) { setTimeout(resolve, ms); }); } function foo(item, ms) { return function() { return setT

Promise.all()不能保证承诺会按顺序得到解决。如何做到这一点?

最让我困惑的是,被链接的异步函数需要返回一个返回承诺的函数。下面是一个例子:

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返回一个函数,该函数返回一个承诺。foo()不会直接返回承诺


请看这个

因为您使用的是Bluebird JS,所以实际上可以用一种简单的方法来完成

在版本2.0中,Bluebird引入了
承诺。每个实现这一点的方法对于循环a来说都足够简单,但由于它非常常见,并且一次又一次地被请求,最终它被添加为自己的方法

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在迭代中执行优化

为什么要返回一个
chain.then()
当这样调用
then()
时,它实际上除了复制承诺之外什么都不做。Benjamin的例子显然更简单。我在处理PockDB中的lie promise lib()时开发了我的,在这种情况下,不支持each()调用。我的问题真的应该引用liejs,而不是bluebirdjs:)。@BenjaminGruenbaum否则你会如何使用我的代码来链接这些承诺?我仍在学习承诺的细微差别,因此我非常感谢您的意见。
退货链
而不是
退货链。然后()
是的,错过了那一条:)