这里我试图循环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('*************************************************************');
});
答案 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]);
});
});
});