异步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中的每个变量范围的主要内容,如果未能解决你的问题,请参考以下文章