异步nodejs中的每个变量范围

Posted

技术标签:

【中文标题】异步nodejs中的每个变量范围【英文标题】:async each variable scope in nodejs 【发布时间】:2017-02-10 01:59:56 【问题描述】:

我使用 async each 循环并构造一个名为 coupon_bo 的对象。令人惊讶的是,在processbo 函数内部,我看到了一个副作用,即只有coupon_bo 对象的最后一个副本可用于processbo 函数。

我的理解是,由于coupon_bo对于每次迭代都是本地的,所以应该有一个新的对象进行迭代。

我错过了什么吗?

function hitApplyLogic(coupon_names, coupons_list, req, callback) 
    async.each(coupon_names, function(coupon_name, callback) 
        var coupon_bo = new coupon_objects.CouponsBO();
        coupon_bo.incoming_request = req.body;
        coupon_bo.incoming_request['coupon_code'] = coupon_name.cn;
        coupon_bo.incoming_request['list_offers'] = true;

        setTimeout(function()
        
            console.log("CONSOLE-BO: " + JSON.stringify(coupon_bo));

        , 1000);
    );

【问题讨论】:

请多放一些代码,比如你在哪里调用回调等等 async.each() 异步运行,可能会损坏您的数据coupon_bo。您可能喜欢使用async.eachSeries() 或使用this.coupon_bo 而不是var coupon_bo @suraj99934 在函数内部调用回调(结果) 你能不能把这个async.each(coupon_names, function(coupon_name, callback) 换成async.eachLimit(coupon_names, 1, function(coupon_name, callback) 并且检查问题仍然存在吗? @suraj99934 查看更新后的代码。它重现了正在发生的问题。总是最后一个 BO 打印在 console.log 中。我猜这是每个人的行为,它不会创建新的范围 【参考方案1】:

async.each 不保证任务按顺序运行。

根据documentation:

请注意,由于此函数将 iteratee 并行应用于每个项目,因此无法保证 iteratee 函数将按顺序完成。

我不确定您所说的 processbo 函数是什么意思。但是var coupon_bo 对于运行的迭代对象的每个实例都应该是唯一的。所以应该没有被其他人覆盖的问题。

我也不确定你为什么在 1 秒后使用 setTimeout 来记录 coupon_bo

我确实发现您的实现中缺少一些东西,即在 iteratee 中对 callback 函数的调用 async.each(coupon_names, function(coupon_name, callback)

如果不调用它,您将永远停留在async.each

function hitApplyLogic(coupon_names, coupons_list, req, callback) 
    async.each(coupon_names, function(coupon_name, eachCallback)  //Changed callback to eachCallback to avoid confusion with the one received in hitApplyLogic
        var coupon_bo = new coupon_objects.CouponsBO();
        coupon_bo.incoming_request = req.body;
        coupon_bo.incoming_request['coupon_code'] = coupon_name.cn;
        coupon_bo.incoming_request['list_offers'] = true;

        setTimeout(function()
        
            console.log("CONSOLE-BO: " + JSON.stringify(coupon_bo));
            eachCallback(null); // Finished doing all the work with this particular coupon_name
        , 1000);
    ,
    , function(err)  //This function is called once all the coupon_names were processed

        if(err) 
          // One of the coupon_names returned an error
          console.log('One of the coupon_names returned an error');
          return callback(err); // Callback received in hitApplyLogic
         else 
          // Everything went OK!
          console.log('All coupons were constructed');
          return callback(null); // Callback received in hitApplyLogic
        );

【讨论】:

【参考方案2】:

这是您的问题的解决方案,Async's each immediately prints out all elements

async.eachSeries() 将一次迭代数组项,async.each() 将一次并行迭代所有项。

【讨论】:

我需要并行性 如果你想要并行操作而不出错迭代,我建议你在async.each中使用async.waterfall(caolan.github.io/async/docs.html#.waterfall)在每次迭代时调用你的函数。

以上是关于异步nodejs中的每个变量范围的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs + Coffeescript 的变量范围

无法通过 DiscordJS 中的不同范围传递变量

如何定义常量在全局范围内nodejs

每个内的 jQuery 变量范围

Yesod 布局中的站点范围变量(django 上下文处理器模拟)

Javascript,回调函数中的变量范围之外?