Node.js用于循环asynchronous请求

我有for循环请求(和callback中的另一个请求)。

我有内存使用问题(当我经历了很多请求的同时)

这里是示例代码:

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 } } }); } 

解决schemebuild议我使用asynchronous模块。

在阅读文档后,我发现eachlimit适合我的需求。

我有它的问题我可以使用eachlimit第二循环,但对于第一循环,我不知道如何使用它(因为第一个循环不是数组)。

这里代码到目前为止,我得到了,它不工作:

 var request = require('request'); var mongodb = require('mongodb'); var async = require('async'); var MongoClient = mongodb.MongoClient; var url = 'mongodb://localhost:27017/subtitle'; for(var j=1;j<=10;j++){ request({ method: 'GET', url: 'https://api-v2.domain.com/news/popular?page='+j+'&limit=1000', headers: { 'Content-Type': 'application/json', 'api-version': '2', 'api-key': 'my-api-key' }}, function (error, response, body) { try { var data = JSON.parse(body); } catch (e) { // An error has occured, handle it, by eg logging it console.log(e); } async.each(data, function(item, callback) { request({ method: 'GET', url: 'https://api-v2.domain.com/news/'+item.id, headers: { 'Content-Type': 'application/json', 'api-version': '2', 'api-key': 'my-api-key' }}, function (error, response, body) { // sava item in mongodb }) callback(); }, function(err){ if( err ) { console.log('A item failed to process'); } else { console.log('All items have been saved successfully'); } }); }) } 

你可以通过很多方式来实现这个目标,其中一个将会使用while。 你的代码看起来像这样(为了便于阅读,删除了error handling和请求选项):

 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 } ); 

一旦你开始嵌套这么多的callback,你可能应该重构这个,把第二个循环放在它自己的函数中。 例如:

 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); } 

此外,请确保在请求的callback中调用asynchronouscallback(您在代码中没有这样做)。