Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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
循环异步请求的Node.js_Node.js_Asynchronous - Fatal编程技术网

循环异步请求的Node.js

循环异步请求的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',

我有一个请求(以及回调中的另一个请求)的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',
              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);
}