嵌套的异步.each系列堆栈迭代
Nested async.eachSeries stacks iterations
以下函数接收链接数组并扫描远程网站,每页获取 10 篇博客文章,然后使用 async.waterfall
获取博客文章的每条评论。
// @param {Array} url
export default function getData(url, cb) {
const arrayOfPosts = [];
// Outer loop
async.eachSeries(url, (link, topLVLcb) => {
// Waterfall
async.waterfall([
// Collects links to posts
callback => {
request(link, (err, response, body) => {
console.log(`working on ${link}`);
const $ = cheerio.load(body);
// OVERALL 10 LINKS PER ONE BLOGPOST
$('.blogpost').each((i, element) => {
// build post ojbect
const post = {
content,
link,
comments: []
}
arrayOfPosts.push(post);
});
callback(null, arrayOfPosts);
});
},
// Looks for details in given post
(arrOfPosts, postDetailsCallback) => {
let counter = 1;
// Inner loop through 10 links
async.eachSeries(arrOfPosts, (post, eachSeriesCallback) => {
request(post.link, (err, response, body) => {
console.log(counter++);
const $ = cheerio.load(body);
$('.comment').each((i, element) => {
// build comment
const comment = {
author,
content
};
post.comments.push(comment);
});
eachSeriesCallback(null);
});
}, postDetailsCallback);
}
], err => {
console.log('DONE PAGE');
console.log('*************************');
topLVLcb(err);
});
}, (result, err) => {
if (err) {
throw err;
} else {
console.log('DONE ALL');
cb(arrayOfPosts);
}
});
}
它提供如下输出:
working on www.mywebsite.com/
1
2
3
4
5
6
7
8
9
10
DONE PAGE
**************************************************************
working on www.mywebsite.com/posts/1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DONE PAGE
**************************************************************
它将每个页面递增 10,从每次迭代重新开始。虽然它应该扫描每页 10 次。我认为我已经搞砸了一些回调,但我已经无法弄清楚确切的几个小时了。这是我的第一个nodejs异步代码,它非常压倒性。
似乎您将所有帖子存储在顶级arrayOfPosts
中,但这意味着在第二个瀑布函数中,您将从头开始处理所有帖子,因为这是您传递给回调的内容。因此,在收集帖子链接的第一个回调中,您应该有一个本地帖子数组,您可以将这些帖子传递给下一个回调。
arrayOfPost[]
对每个async.waterfall
都是全球性的......对于每个 url 元素 在url
你应该创建一个新的arrayOfPost[]
,如 遵循。。。。
export default function getData(url, cb) {
const arrayOfPosts = [];
// Outer loop
async.eachSeries(url, (link, topLVLcb) => {
var tmpArr=[];
// Waterfall
async.waterfall([
// Collects links to posts
callback => {
request(link, (err, response, body) => {
console.log(`working on ${link}`);
const $ = cheerio.load(body);
// OVERALL 10 LINKS PER ONE BLOGPOST
$('.blogpost').each((i, element) => {
// build post ojbect
const post = {
content,
link,
comments: []
}
tmpArr.push(post);
arrayOfPosts.push(post);
});
callback(null, tmpArr);//this tmpArr which is being passed will always cantain 10 items(posts) so there will be 10 iterations for each element in url
});
},
// Looks for details in given post
(arrOfPosts, postDetailsCallback) => {
let counter = 1;
// Inner loop through 10 links
async.eachSeries(arrOfPosts, (post, eachSeriesCallback) => {
request(post.link, (err, response, body) => {
console.log(counter++);
const $ = cheerio.load(body);
$('.comment').each((i, element) => {
// build comment
const comment = {
author,
content
};
post.comments.push(comment);
});
eachSeriesCallback(null);
});
}, postDetailsCallback);
}
], err => {
console.log('DONE PAGE');
console.log('*************************');
topLVLcb(err);
});
}, (result, err) => {
if (err) {
throw err;
} else {
console.log('DONE ALL');
cb(arrayOfPosts);
}
});
}
相关文章:
- 如何在javascript中迭代数字列表
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 如何迭代Array.prototype函数
- 如何使用jquery迭代具有相同属性的html元素并查找onclick事件
- 在ejs-partial中对JSON对象进行迭代
- 如何在DataTables 2.1中迭代对象数组
- 使用递归属性迭代保留属性结构
- 正在停止.在jquery中的特定时间间隔内,每次迭代的每次执行
- 如果30秒未单击,请应用CSS一次,将其删除,然后重新迭代
- 主干-从模板中迭代的集合中获取特定的模型
- 创建一个方法,通过一个窗口进行迭代并获取Titanium中的所有控件
- 什么's是在javascript中迭代项的最佳方式
- 为什么这只是迭代 HTMLCollection 的奇怪元素
- 是否“;对于的“;循环迭代遵循JavaScript中的数组顺序
- Babel编译错误:找不到模块核心js/library/fn/get迭代器
- 在JavaScript中异步迭代大型数组,而不会触发超出堆栈大小
- 嵌套的异步.each系列堆栈迭代
- 在不超过堆栈限制的情况下,迭代或递归大量庞大函数的最佳方式是什么
- 在递归循环中迭代和处理JSON对象会导致堆栈超出错误
- 递归迭代器上的最大调用堆栈大小错误