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

时间:2016-06-14 22:34:27

标签: javascript node.js promise response bluebird

我有一个空的文档数组。

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,但我不确定。谢谢!

2 个答案:

答案 0 :(得分:4)

您可以使用Promise.map方法:

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

答案 1 :(得分:2)

使用promise.all

所示的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*/} } });

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

{{1}}