如何使用多个相关函数正确使用异步...
这是我的尝试无法解决,它位于async.waterfall函数中:
function (urlsCreated, cb) {
var z, artist, title, added_on;
z = [];
async.mapSeries(urlsCreated, function (url, next) {
scrape_music.total_pages(50, url, function (array, total, extra) {
scrape_music.each(artist, title, added_on, array, url, function (result) {
});
});
}, function (z) {
console.log(z);
});
}
这一部分的一切都很好......
基本上urlsCreated是一个包含2个URL的数组......
然后我调用了mapSeries,假设它将在它们之间迭代......
它应该工作的方式是,它遍历数组中的每个url,然后对于每个url,它应该获得url的总页数,然后为每个页面计数添加到数组参数/回调total_pages中的内容应该在......内重复。
基本上这些数组是:urlsCreated(包含2个链接) - >数组(包含total_pages方法中的总页数) - >结果(.each方法应该抓住每个页面,预先包含在数组中的页数),然后重复urlsCreated中的url数量...
任何帮助都会很精彩,目前没有为z打印任何内容,基本上我只想要一个数组,其中包含scrape_music.each结果中返回的对象。
修改 ----
以下是这些功能的代码。
//loop thrugh each page and find jquery elements that match
Scrape.prototype.each = function (artist, title, added_on, array, urls, cb) {
console.log('entered each');
console.log(array);
var $trs, list;
list = [];
this.page(array, urls, function ($page) {
//$trs selects all the rows from 1-50
$trs = $page('tr').slice(11, -3);
$trs.map(function (i, item) {
var result;
result = {};
result.artist = $page(item).find('td').eq(1).text();
result.title = $page(item).find('td').eq(2).text();
result.added_on = $page(item).find('td').eq(3).text();
list.push(result);
});
cb(list);
});
};
Scrape.prototype.total_pages = function (divide, url, cb) {
return request("" + url + config.url.pageQ + 0, function (err, res, body) {
if (err) { throw err; }
var page, select, match, total, matches, array, extra;
array = [];
page = cheerio.load(body);
select = page('tr').slice(9, 10);
match = page(select).find('td').eq(1).text();
matches = match.slice(-18, -14).trim();
total = Math.round(matches / divide);
extra = matches % divide;
for(x = 0; x < total; x++) {
array.push(x);
}
cb(array, total, extra);
});
};
//used to loop through all pages
Scrape.prototype.page = function (array, urls, cb) {
return array.forEach(function (i) {
return request("" + urls + config.url.pageQ + i, function (err, res, body) {
//console.log(urls + config.url.pageQ + i);
if (err) { throw err; }
cb(cheerio.load(body));
});
});
};
答案 0 :(得分:1)
function (urlsCreated, cb) {
var artist, title, added_on;
async.mapSeries(urlsCreated, function (url, next) {
scrape_music.total_pages(50, url, function (array, total, extra) {
// 1:
scrape_music.each(artist, title, added_on, array, url, function (result) {
// 2:
next(null, result);
});
});
}, function (err, z) {
// 3:
console.log(z);
});
}