node.js - Node async.series 问题

标签 node.js node-async node-request

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

下面的代码发生了什么: 1)请求一个URL 2) 从结果中抓取 NEWURL 3) 将其作为第一个异步函数传递给可读性 API 4)麻烦来了——我从来没有得到下一个将 readabilityData 保存到数据库的异步函数

如何解决这个问题? 我是 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')
});

关于node.js - Node async.series 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27799491/

相关文章:

node.js - 我无法从 npm 安装 npm 模块,为什么?

node.js - 处理 socket.io 异步获取/设置调用

node.js - 与 Node 一起使用异步

javascript - Express js 中的 async.waterfall 方法

javascript - async.each 不运行回调函数

javascript - 使用 spread 减少 es6 丢失的嵌套对象数组

javascript - Node.js 中的异步递归

javascript - NodeJS Passport 本地身份验证不起作用

javascript - 检查新端口上运行的应用程序

node.js - 如何从 node.js 中的请求模块获取 cookie?