在节点请求的循环中等待所有完成的请求
Wating for all finished request in a loop with node request
我使用节点请求ajax包。因此,我有一个循环,在每次迭代中,它向我的服务器发出请求。
// realItems needs the complete value of items assigned
var realItems;
var items = [];
_.forEach(JSON.parse(body), (value, key) => {
request('myurl/' + id, (error, response, body) => {
items = JSON.parse(body)
});
});
我如何从request
包捆绑我的所有请求,所以我可以在最后分配items
变量的值给realItems
?
//编辑:
我使用react js,所以在这种情况下,realItems
是一个状态,我不能在每个循环迭代中触发它,因为渲染触发每个setState
有很多方法可以做到这一点。下面是一个不保留结果顺序的暴力破解方法:
var items = [];
var cnt = 0;
_.forEach(JSON.parse(body), (value, key) => {
++cnt;
request('myurl/' + value.id, (error, response, body) => {
items.push(JSON.parse(body));
// if all requesets are done
if (--cnt === 0) {
// process items here as all results are done now
}
});
});
这是一个使用蓝鸟承诺的版本:
var Promise = require('bluebird');
var request = Promise.promisify(require("request"));
Promise.promisifyAll(request);
var promises = [];
_.forEach(JSON.parse(body), (value, key) => {
promises.push(request('myurl/' + value.id));
});
Promise.all(promises).then(function(results) {
// all requests are done, data from all requests is in the results array
// and are in the order that the requests were originally made
});
这里有一个更简单的Bluebird promises方法它使用了一个Bluebird迭代器:
var Promise = require('bluebird');
var request = Promise.promisify(require("request"));
Promise.promisifyAll(request);
Promise.map(JSON.parse(body), function(value) {
return request('myurl/' + value.id);
}).then(function(results) {
// all requests are done, data is in the results array
});
您是否需要使用request
包?我使用async
,这是类似的,并附带一个parallel
方法,这正是你所要求的-
https://github.com/caolan/async平行
的例子:
async.parallel([
function(callback){
setTimeout(function(){
callback(null, 'one');
}, 200);
},
function(callback){
setTimeout(function(){
callback(null, 'two');
}, 100);
}
],
// optional callback
function(err, results){
// the results array will equal ['one','two'] even though
// the second function had a shorter timeout.
});
相关文章:
- 正在销毁节点中的请求
- 如何发送作为节点请求响应函数中的代码块的响应
- 将curl转换为节点请求
- 只需添加一个'允许跨来源请求'到我的节点应用程序工作
- 节点:通过请求下载zip,zip已损坏
- 节点.js接受 POST 请求的服务器
- 带有节点.js的 curl 请求
- 跨节点服务器上的多个 API 请求维护数据
- 节点.js请求库的相对 URI
- 节点 js 将变量传递到请求回调函数中
- 使用节点请求模块的 UTF8 字符编码
- 同步数据库请求节点JS ORM
- 请求节点模块变量范围
- 如何使用 sinon.stub 编写单元测试以“请求”节点模块
- 请求节点.js后浏览器显示错误
- 连续Post请求节点JS
- 如何使用ajax请求节点js来处理js
- 如何在http传递数组.请求节点
- 检测ajax对普通请求节点js的请求
- 请求节点模块不给html