节点async.series麻烦

时间:2015-01-06 13:15:43

标签: node.js node-async node-request

在构建一个相当复杂的刮刀时,我偶然发现了代码控制流的问题。

以下代码中发生了什么: 1)请求URL 2)从结果中刮掉NEWURL 3)将其作为第一个异步函数传递给可读性API 4)遇到麻烦 - 我从来没有得到下一个异步函数,它将readabilityData保存到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')
            });


        });
    }
});

1 个答案:

答案 0 :(得分:1)

当每个函数的工作完成时,您需要调用传递给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')
});