我尝试使用nodejsasync.eachSeries运行大量的url。我想在流程完成后显示成功消息。但在我的代码中,成功消息只是在所有过程完成之前出现。请看一下我的代码:
var request = require("request"),
cheerio = require("cheerio"),
mysql = require('mysql'),
async = require('async');
carlistrequest=request.defaults({
headers: {
'User-Agent':'request'
}
});
var callUrls =[
'http://www.carlist.my/used-cars/2625750/2006-mercedes-benz-s350-amg-w221-full-loan.html',
'http://www.carlist.my/used-cars/2625770/2010-toyota-estima-2-4-aeras-unregister-full-loan.html',
'http://www.carlist.my/used-cars/2625739/2012-honda-city-1-5-e-facelift-full-loan.html',
'http://www.carlist.my/used-cars/2536923/2002-bmw-318i-e46-2-0-cash-only-012-634-6341.html',
'http://www.carlist.my/used-cars/2625567/-loan-up-to-rm43k-2009-toyota-vios-1-5-j-spec-a-trd-bodykit-2015-final-clear-stock-hurry-up-.html'
];
async.eachSeries(callUrls, function(uri, next){
carlistrequest(uri, function(err, response, body){
var $ = cheerio.load(body);
var data={
name: $('#main-sidebar').find('.sub').text()
}
console.log(data);
})
next();
},function(callback){
console.log('All Url Done');
})
如何逐一运行url,并在所有url运行完成后,只显示成功消息。谢谢:)
最佳答案
移动next()
在您的请求的回调中。
async.eachSeries(callUrls, function (uri, next) {
carlistrequest(uri, function (err, response, body) {
var $ = cheerio.load(body);
var data = {
name: $('#main-sidebar').find('.sub').text()
}
console.log(data);
next(); // <<<<<<<<<<<<
})
}, function (callback) {
console.log('All Url Done');
});
next()
当 function(uri, next)
时告诉异步是通过一个 url 完成的,如果您在请求回调之外调用它,则无需等待请求完成。
另一个副作用是,在您的代码中,迭代并未像调用 eachSeries()
时那样按顺序完成。 ,多个请求同时运行。如果您有数百个网址需要请求,您将被禁止访问正在查询的服务器。
关于javascript - 如何在异步nodejs中完成所有过程并打印出消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34107573/