循环异步请求的Node.js
我有一个请求(以及回调中的另一个请求)的for循环 我的内存使用有问题(当我同时处理很多请求时) 以下是示例代码:循环异步请求的Node.js,node.js,asynchronous,Node.js,Asynchronous,我有一个请求(以及回调中的另一个请求)的for循环 我的内存使用有问题(当我同时处理很多请求时) 以下是示例代码: var request = require('request'); for(var j=1;j<=10;j++){ request({ method: 'GET', url: 'https://api.domain.com/items/?page='+j+'&limit=1000',
var request = require('request');
for(var j=1;j<=10;j++){
request({
method: 'GET',
url: 'https://api.domain.com/items/?page='+j+'&limit=1000',
headers: {
'Content-Type': 'application/json'
}}, function (error, response, body) {
var data = JSON.parse(body)
for(var i=0;i<data.length;i++){
request({
method: 'GET',
url: 'https://api.domain.com/itemDetail/'+data[i].id,
headers: {
'Content-Type': 'application/json',
}}, function (error, response, body) {
var itemDetails = JSON.parse(body);
// save items to mongodb
}
}
});
}
您可以通过多种方式实现这一点,其中之一就是使用while。对于您的代码,它看起来是这样的(删除了错误处理和请求选项以提高可读性):
var requestCount=0;
异步的(
函数(){
返回请求计数<10;
},
函数(第一次回调){
请求({url:)https://api-v2.domain.com/news/popular?page=“+requestCount+”&limit=1000“},函数(err1、res1、body1){
var data=JSON.parse(body1);
async.each(
数据,
函数(项,第二个回调){
请求({url:)https://api-v2.domain.com/news/“+item.id},函数(err2、res2、body2){
//mongodb中的sava项目
secondCallback();
});
},
功能(err){
requestCount++;
firstCallback();
}
);
});
},
功能(err){
//所有请求都已完成
}
);
一旦您开始嵌套这么多回调,您可能应该重构它,并将第二个循环放入它自己的函数中。例如:
var requestCount = 0;
async.whilst(
function () {
return requestCount < 10;
},
function (callback) {
request({url: "https://api-v2.domain.com/news/popular?page=" + requestCount + "&limit=1000"}, function (err, res, body) {
var items = JSON.parse(data);
getNews(items, function(newsErr){
requestCount++;
callback(newsErr);
});
});
},
function (err) {
//all requests done
}
);
//----------------------------------------------------
function getNews(items, callback){
async.each(items, function(item, itemCallback) {
request({url: "https://api-v2.domain.com/news/" + item.id}, function (err2, res2, body2) {
// sava item in mongodb
itemCallback();
});
}, callback);
}
var requestCount=0;
异步的(
函数(){
返回请求计数<10;
},
函数(回调){
请求({url:)https://api-v2.domain.com/news/popular?page=“+requestCount+”&limit=1000“},函数(err、res、body){
var items=JSON.parse(数据);
getNews(项目、函数(newsErr){
requestCount++;
回调(newsErr);
});
});
},
功能(err){
//所有请求都已完成
}
);
//----------------------------------------------------
函数getNews(项,回调){
async.each(项,函数(项,项回调){
请求({url:)https://api-v2.domain.com/news/“+item.id},函数(err2、res2、body2){
//mongodb中的sava项目
itemCallback();
});
},回调);
}
还要确保在请求的回调中调用异步回调(您在代码中没有这样做)。我们不需要添加requestCount++?在并行运行时,还有一个问题?
var requestCount = 0;
async.whilst(
function () {
return requestCount < 10;
},
function (firstCallback) {
request({url: "https://api-v2.domain.com/news/popular?page=" + requestCount + "&limit=1000"}, function (err1, res1, body1) {
var data = JSON.parse(body1);
async.each(
data,
function(item, secondCallback) {
request({url: "https://api-v2.domain.com/news/" + item.id}, function (err2, res2, body2) {
// sava item in mongodb
secondCallback();
});
},
function(err){
requestCount++;
firstCallback();
}
);
});
},
function (err) {
//all requests done
}
);
var requestCount = 0;
async.whilst(
function () {
return requestCount < 10;
},
function (callback) {
request({url: "https://api-v2.domain.com/news/popular?page=" + requestCount + "&limit=1000"}, function (err, res, body) {
var items = JSON.parse(data);
getNews(items, function(newsErr){
requestCount++;
callback(newsErr);
});
});
},
function (err) {
//all requests done
}
);
//----------------------------------------------------
function getNews(items, callback){
async.each(items, function(item, itemCallback) {
request({url: "https://api-v2.domain.com/news/" + item.id}, function (err2, res2, body2) {
// sava item in mongodb
itemCallback();
});
}, callback);
}