瀑布中的嵌套 async.eachSeries 以错误的顺序执行
Nested async.eachSeries in waterfall executes in wrong order
在异步瀑布的第二个函数中,我的代码中的 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)
})
AFAIK,async.eachSeries 采用三个参数(数组、functionToBeExecuteOnEachItem、回调)并按该顺序执行它们。不知何故不在这里。
async.eachSeries
的参数是函数定义。类似于 waterfallCallback
或 function(err,result){}
.
当你调用waterfallCallback(null, itemUrls)
时,那不是函数定义,那是运行函数本身!
更改为简单的 waterfallCallback
应该可以解决问题。
更新:此外,.eachSeries
不会 return 将值作为数组,它的最终回调只是 function(err)
。相反,签出 .mapSeries
link,这将 return 最终回调 function(err,finalArray)
中的结果数组。 (请注意,.map
的每个 return 都将是数组中的一个元素,因此如果您 return 一个数组,您将获得类似 [ [], [], [] ]
的数据结构)
在异步瀑布的第二个函数中,我的代码中的 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)
})
AFAIK,async.eachSeries 采用三个参数(数组、functionToBeExecuteOnEachItem、回调)并按该顺序执行它们。不知何故不在这里。
async.eachSeries
的参数是函数定义。类似于 waterfallCallback
或 function(err,result){}
.
当你调用waterfallCallback(null, itemUrls)
时,那不是函数定义,那是运行函数本身!
更改为简单的 waterfallCallback
应该可以解决问题。
更新:此外,.eachSeries
不会 return 将值作为数组,它的最终回调只是 function(err)
。相反,签出 .mapSeries
link,这将 return 最终回调 function(err,finalArray)
中的结果数组。 (请注意,.map
的每个 return 都将是数组中的一个元素,因此如果您 return 一个数组,您将获得类似 [ [], [], [] ]
的数据结构)