如何拥有可变数量的 Bluebird Promises? (节点)

How to have a variable number of Bluebird Promises? (Nodejs)

我有一个空的文档数组。

let arrayOfDocuments = [];

我想调用 http 请求(使用 superagent)来下载文本文件并将其内容放入我的 arrayOfDocuments。

request.get('docs.google.com/document/d/SOME_FILE_NAME').then((res) => {
    arrayOfDocuments.push(res.text);
});

那部分我明白了,但这里是棘手的部分。我想把它放在一个 for 循环中并在 for 循环之后做一些事情。所以喜欢:

for (let i = 0; i < numOfLinks; i++) {
    // send the http requests as above
}

//do stuff here but only after the above for loop is finished.

如果循环结束,我如何只执行最后一行?我的程序现在的方式是 运行,for 循环之后的代码在 http 请求获得响应并完成之前运行。我认为有一种方法可以使用 Bluebird Promises 来做到这一点,但我不确定。谢谢!

按此处所示使用 promise.all http://bluebirdjs.com/docs/api/promise.all.html

在实践中它可能看起来像:

var promises = []
var links = ['a.com/a', 'a.com/b']

for (let i = 0; i < links.length; i++) {
    promises.push(request.get(links[i])
}

Promise.all(promises).then(function(allRes) {
    //do anything you want with allRes or iterate
    for (var promise in promises){
      promise.then(function(singleRes){/*do something with each promise after all resolve*/}
    }
});

您可以使用Promise.map方法:

Promise.map(arrayOfLinks, function(link) {
  return request.get(link);
}).then(function(arrayOfDocuments) {
   // ...
});