节点。 js具有多个http请求的嵌套异步映射

时间:2017-07-21 01:42:52

标签: javascript node.js asynchronous

这里我试图循环URLS数组并从一组URL获取响应并处理响应URL。在代码中我希望外部循环应该在完成所有内部请求后输入,并希望得到如下结果。

https://stackoverflow.com中检查网址 状态200完成 .... .... 检查网址:https://example.com ..... ..... .....

总链接#20

但是在我的代码中,外部循环在请求完成之前完成。

const getHrefs = require('get-hrefs');
const async = require("async");
var req = require('request-promise');
var errors = require('request-promise/errors');

var pageUrls = ['https://stackoverflow.com','https://www.exsample.com'];
testUrls='';

async.map(pageUrls, function(pageUrl,callback){
    //process itemA
    req(pageUrl, function (err, response, body) {
        console.log(pageUrl, " STATUS: ", response.statusCode);
        if ( err){
            return callback(err);
        } 
        else {
        testUrls= getHrefs(response.body);

        async.map(testUrls, function(testUrl,callback1){
             linkCount++;
               req(testUrl).catch(errors.StatusCodeError, function (reason) {
                        brokenLinks++;
                        console.log("URL: "+ testUrl+ "reason: "+ reason.statusCode);
                    })
                    .catch(errors.RequestError, function (reason) {

                    }).finally(function () {


                    });

                return  callback1();
             },function(err){

                 callback();

              }) ;
        }
    })

} ,function(err){
    console.log("OuterLoopFinished");
    console.log('*************************************************************' + '\n');
    console.log('Check complete! || Total Links: ' + linkCount + ' || Broken Links: ' + brokenLinks);
    console.log('*************************************************************');

});

1 个答案:

答案 0 :(得分:0)

我认为你应该重新审视自己的方法。这使得400个URL。您应该并行触发所有请求(对于子链接),然后您可以从主机URL跟踪损坏的URI的计数。这将更快地完成您的脚本。




  const pageUrls = ['https://stackoverflow.com','https://www.google.com'];
 const rp = require('request-promise');
 const allRequestPromises = [];
 const getHrefs = require('get-hrefs');

 const checkBrokenCount =(url ,主持人)=> {
 rp(url).then((response)=> {
 console.log('valid url',url,host);
 //其他代码
})
 .catch((error)=> {
 console.log('invalid url',url,host);
});
}

 pageUrls。 forEach((pageUrl)=> {
 //让我们并行调用所有基本URL,因为没有错误。
 allRequestPromises.push(rp({uri:pageUrl,resolveWithFullResponse:true})) ;
});
 Promise.all(allRequestPromises).then((answers)=> {
 responses.forEach((response,index)=> {
 / / Promise.all保证结果的顺序。
 console.log(pageUrls [index],response.statusCode);
 const testUrls = getHrefs(response.body);
 testUrls.forEach( (testUrl)=> {
 checkBrokenCount(testUrl,pageUrls [index]);
});
});
});