Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何拥有数量可变的蓝鸟承诺?(Nodejs)_Javascript_Node.js_Promise_Response_Bluebird - Fatal编程技术网

Javascript 如何拥有数量可变的蓝鸟承诺?(Nodejs)

Javascript 如何拥有数量可变的蓝鸟承诺?(Nodejs),javascript,node.js,promise,response,bluebird,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循环之后

我有一个空的文档数组

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(设i=0;i

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

使用
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*/}
    }
});
var承诺=[]
var links=['a.com/a','a.com/b']
for(设i=0;i
使用
承诺。所有
如图所示

实际上,它可能看起来像:

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*/}
    }
});
var承诺=[]
var links=['a.com/a','a.com/b']
for(设i=0;i
您可以使用以下方法:

您可以使用以下方法:


我想你在寻找。我如何获得每个发送请求的响应?我想你在寻找。我如何获得每个发送请求的响应?我如何获得每个请求的响应?就像我想检查每个响应的类型(res.type)使用不同的类型执行稍有不同的操作。in-then方法可访问由承诺数组排序的响应数组。i-then方法是什么?您可以简化代码以执行承诺。全部(links.map(link=>request.get(link))。然后(arrayOfResponses=>/*做任何事情*/);@JoseHermosillaRodrigo考虑过这个问题,但我尽量不认为自己熟悉map/forEach/filter函数。在for循环时,它们会让一些人感到困惑(在本例中,它们很难看,而且过于冗长)你是完全正确的,我希望你的代码是真实的。但是我如何得到每个请求的响应?就像我想检查每个响应的类型(res.type)使用不同的类型执行稍有不同的操作。in-then方法可访问由承诺数组排序的响应数组。i-then方法是什么?您可以简化代码以执行承诺。全部(links.map(link=>request.get(link))。然后(arrayOfResponses=>/*做任何事情*/);@JoseHermosillaRodrigo考虑过这一点,但我尽量不认为自己熟悉map/forEach/filter函数。它们让一些人感到困惑,而for循环(在本例中,虽然很难看且过于冗长)更容易识别。你完全正确,我更喜欢你的代码行。这取决于你的情况(特别是如果你不关心处理个人承诺,只想收集所有承诺)此解决方案可能比我的解决方案更好。在阅读问题后,我不清楚这是否是事实(现在仍然是),因此我在回答中提出了更一般的方法。取决于你的情况(特别是如果你不关心处理个人承诺,只想收集所有承诺)这个解决方案可能比我的好。在阅读了问题后,我不清楚这是否是事实(现在仍然是),因此我在回答中提出了更一般的方法。