节点async.series麻烦

虽然build立一个相当复杂的刮板我偶然发现了一个控制我的代码stream的问题。

在下面的代码中发生了什么:1)请求一个URL 2)从结果中抓取NEWURL 3)将它传递给可读性API作为第一个asynchronous函数4)麻烦 – 我从来没有得到下一个asynchronous函数,

如何解决这个问题呢? 我是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调用的函数的callback参数。 这就是async.series知道它可以继续下一个function。 当您尝试使用它来共享函数中的数据时,请不要将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') });