节点async.series麻烦
Node async.series trouble
在构建一个相当复杂的爬虫时,我偶然发现了我的代码控制流的问题。
下面的代码发生了什么:
1) 请求 URL
2) 从结果中刮取 NEWURL
3) 将其作为第一个异步函数传递给可读性 API
4) 麻烦来了——我从来没有得到下一个将可读性数据保存到 DB
的异步函数
如何解决这个问题?
我是 JS 新手,所以请随时指出我的代码中的任何问题。
request(URL, function(error, response, html) {
if (!error) {
var $ = cheerio.load(html);
NEWURL = data.find('a').attr('href');
readabilityData = {}
var articleUrl = 'https://readability.com/api/content/v1/parser?url=' + NEWURL + token;
async.series([
function(){
request(articleUrl, function(error, response, html) {
if (!error) {
readabilityData = response.toJSON();
}
});
},
function(readabilityData){
Article.findOne({
"link": url // here's the
}, function(err, link){
if(link) {
console.log(link)
} else {
var newArticle = new Article({
// write stuff to DB
});
newArticle.save(function (err, data) {
// save it
});
}
});
}
],
function(err){
console.log('all good — data written')
});
});
}
});
当每个函数的工作完成时,您需要调用传递给 async.series
调用函数的回调参数。这就是 async.series
知道它可以继续执行下一个功能的方式。当您尝试使用它在函数之间共享数据时,不要将 readabilityData
重新定义为函数参数。
所以像这样:
var readabilityData = {};
async.series([
function(callback){
request(articleUrl, function(error, response, html) {
if (!error) {
readabilityData = response.toJSON();
}
callback(error);
});
},
function(callback){
Article.findOne({
"link": url // here's the
}, function(err, link){
if(link) {
console.log(link);
callback();
} else {
var newArticle = new Article({
// write stuff to DB
});
newArticle.save(function (err, data) {
// save it
callback(err);
});
}
});
}
],
function(err){
console.log('all good — data written')
});
在构建一个相当复杂的爬虫时,我偶然发现了我的代码控制流的问题。
下面的代码发生了什么: 1) 请求 URL 2) 从结果中刮取 NEWURL 3) 将其作为第一个异步函数传递给可读性 API 4) 麻烦来了——我从来没有得到下一个将可读性数据保存到 DB
的异步函数如何解决这个问题? 我是 JS 新手,所以请随时指出我的代码中的任何问题。
request(URL, function(error, response, html) {
if (!error) {
var $ = cheerio.load(html);
NEWURL = data.find('a').attr('href');
readabilityData = {}
var articleUrl = 'https://readability.com/api/content/v1/parser?url=' + NEWURL + token;
async.series([
function(){
request(articleUrl, function(error, response, html) {
if (!error) {
readabilityData = response.toJSON();
}
});
},
function(readabilityData){
Article.findOne({
"link": url // here's the
}, function(err, link){
if(link) {
console.log(link)
} else {
var newArticle = new Article({
// write stuff to DB
});
newArticle.save(function (err, data) {
// save it
});
}
});
}
],
function(err){
console.log('all good — data written')
});
});
}
});
当每个函数的工作完成时,您需要调用传递给 async.series
调用函数的回调参数。这就是 async.series
知道它可以继续执行下一个功能的方式。当您尝试使用它在函数之间共享数据时,不要将 readabilityData
重新定义为函数参数。
所以像这样:
var readabilityData = {};
async.series([
function(callback){
request(articleUrl, function(error, response, html) {
if (!error) {
readabilityData = response.toJSON();
}
callback(error);
});
},
function(callback){
Article.findOne({
"link": url // here's the
}, function(err, link){
if(link) {
console.log(link);
callback();
} else {
var newArticle = new Article({
// write stuff to DB
});
newArticle.save(function (err, data) {
// save it
callback(err);
});
}
});
}
],
function(err){
console.log('all good — data written')
});