在异步瀑布中的第二个函数中,我的代码中的eachSeries
回调(urlCallback
)在瀑布回调(waterfallCallback
)之后执行,原因我无法弄清楚。
async.waterfall([
function(callback) {
request(website, function (error, response, html) {
if (!error && response.statusCode == 200) {
pageUrls = getPageUrls(html)
callback(null, pageUrls)
}
})
},
function (pageUrls, waterfallCallback) {
async.eachSeries(pageUrls, function (url, urlCallback) {
console.log('SET ' + url)
request(url, function (err, response, body) {
var $ = cheerio.load(body)
$('#div').children().each(function(){
console.log($(this).children("a").attr("href"));
itemUrl = $(this).children("a").attr("href")
itemUrls.push(itemUrl)
})
urlCallback(null,itemUrls)
})
},
waterfallCallback(null, itemUrls))
}
],
function(err, results) {
console.log("results: " + results)
})
async。eachSeries接受三个参数(array,functionToBeExecuteOnEachItem,callback),并按顺序执行它们。
async.eachSeries
的参数为函数定义。例如waterfallCallback
或function(err,result){}
。
当你调用waterfallCallback(null, itemUrls)
时,那不是一个函数定义,那是在运行函数本身!
改成简单的waterfallCallback
就可以了。
更新:同样,.eachSeries
不返回值作为一个数组,它的最终回调只是function(err)
。签出.mapSeries
链接,它将在最后的回调function(err,finalArray)
中返回结果数组。(注意,每次返回的.map
都是数组中的一个元素,所以如果返回一个数组,就会得到类似[ [], [], [] ]
的数据结构)