Node.js 蓝鸟地图系列

Node.js 蓝鸟地图系列,node.js,promise,bluebird,Node.js,Promise,Bluebird,我正试图按顺序执行一系列承诺,只有在前一个承诺得到解决后,我才会执行下一个承诺。来自蓝鸟文档: 直到项目的上一个项目以及迭代器为该项目返回的承诺得到满足,才会为该项目调用迭代器。 我希望测试函数中的console.log会显示:2000、1000、500、3000。我希望如此,因为正如文档所述,每个项目只有在前一个问题得到解决后才能执行。相反,我得到了500100020003000,这反映了所有函数都是即时调用的。此外,结果确实按照调用的顺序显示结果,尽管这与此无关 我有什么误解吗?您的测试呼

我正试图按顺序执行一系列承诺,只有在前一个承诺得到解决后,我才会执行下一个承诺。来自蓝鸟文档:

直到项目的上一个项目以及迭代器为该项目返回的承诺得到满足,才会为该项目调用迭代器。

我希望测试函数中的console.log会显示:2000、1000、500、3000。我希望如此,因为正如文档所述,每个项目只有在前一个问题得到解决后才能执行。相反,我得到了500100020003000,这反映了所有函数都是即时调用的。此外,结果确实按照调用的顺序显示结果,尽管这与此无关


我有什么误解吗?

您的测试呼叫在承诺之前进行。mapSeries从未有过运行的机会。另外,mapSeries通常在promise实例上运行。也许下面的例子有助于理解?注意测试(时间)这次如何返回函数

function test(time) {
    return function(value) {
      return new Promise(function(resolve, reject) {
          setTimeout(function() {
              console.log('time', time);
              resolve(time);
          }, time);
      });
    };
}

Promise.resolve([test(2000), test(400), test(1000), test(1), test(5000)])
       .mapSeries(function(asyncMethodPassed) {
                    return asyncMethodPassed();
}).then(function(results) {
    console.log('result', results);
});

创建承诺(这就是
test
所做的)是一个同步操作。当然,我仍然希望Bluebird能够发挥一些魔力,并等待调用下一个测试,直到上一个测试完成。这不是文档所说的吗?迭代器返回项目的承诺和项目本身的承诺(在您的情况下就是这样)是有区别的。一旦调用
test
,它将返回“starts”(因此调用
setTimeout
)。给出的答案显示了如何推迟承诺的创建,直到Bluebird明确要求它(这是它唯一可以工作的方式)。这只是我自己的代码上百次遇到的一种问题:-)
function test(time) {
    return function(value) {
      return new Promise(function(resolve, reject) {
          setTimeout(function() {
              console.log('time', time);
              resolve(time);
          }, time);
      });
    };
}

Promise.resolve([test(2000), test(400), test(1000), test(1), test(5000)])
       .mapSeries(function(asyncMethodPassed) {
                    return asyncMethodPassed();
}).then(function(results) {
    console.log('result', results);
});