Node.js 无法使用async.each()异步迭代具有异步块的数组
我想为数组Node.js 无法使用async.each()异步迭代具有异步块的数组,node.js,asynchronous,Node.js,Asynchronous,我想为数组currencyData中的每个元素执行一些异步功能,如下所示。我有以下的逻辑: exports.getCurrenciesOfMerchant(req,res,function(currencyData) { async.each(currencyData, function (eachCurrency) { fieldObject.currencyId=eachCurrency; console.log("See currencyData
currencyData
中的每个元素执行一些异步功能,如下所示。我有以下的逻辑:
exports.getCurrenciesOfMerchant(req,res,function(currencyData)
{
async.each(currencyData, function (eachCurrency) {
fieldObject.currencyId=eachCurrency;
console.log("See currencyData "+fieldObject.currencyId);
//async block starts here
couponHandler.checkIFWalletExists(res,fieldObject,function(fieldObject)
{
console.log("checked wallet for curr "+fieldObject.currencyId);
if(fieldObject.hasWallet == 0)
{
exports.createWalletForUser(fieldObject,res,function(fieldObject,res){
// exports.createCoupon(fieldObject,res,function(res,fieldObject,couponId){
// return exports.couponCreationResponse(res,fieldObject,couponId);
// });
console.log("created wallet");
});
}
});
});
});
以下为结果:
See currencyData 5
See currencyData 6
checked wallet for curr 6
checked wallet for curr 6
created wallet
created wallet
可以看出,async.each()在asnychronous块完成执行之前取了值6。它从未实际运行值5的逻辑
我想这就是async.each()有用的地方。但是,我不能让它工作。尝试使用async.forEachOf
,但得到了相同的结果。报告说:
将函数iteratee并行应用于coll中的每个项。这个
使用列表中的一个项调用iteratee,并对何时调用进行回调
它已经完成了。如果迭代对象将错误传递给其回调,则
主回调(对于每个函数)立即用
错误
注意,由于此函数将iteratee应用于
并行,不能保证迭代对象函数将
按顺序完成
我假设您的代码中没有注释掉方法
couponHandler.checkIFWalletExists
。这意味着迭代器将在完成第一项的处理之前开始处理第二项。可能是因为第二个项目处理得更快,所以您看到的结果顺序错误。您没有调用提供的“完成”回调,因此async
不知道异步操作已完成,不会继续处理其余项目。将迭代器更改为
async.each(currencyData, function (eachCurrency, done) {
并在最内部的回调中调用done
-函数
exports.createCoupon(fieldObject,res,function(res,fieldObject,couponId){
var res = exports.couponCreationResponse(res,fieldObject,couponId);
done();
return res;
});
编辑:…当然,在if-conditional的else分支中也有
} else {
done();
}
如果不希望同时处理项目,请改用:
是的,那个方法被错误地注释掉了。好的,我不介意并行执行,但是如何确保块针对数组
currencyData
中的每个值执行呢?我应该使用异步库的任何其他实用程序吗?@sandePanath该方法对每个项都执行。您只需为每个项目重写sharedfieldObject
的属性,这就是为什么您总是看到最新处理的fieldObject.currencyId
。带有done回调的each()也不适用于我。产生了同样的结果。然而,每一个限制都起了作用。
async.eachLimit(currencyData, 1, function (eachCurrency, done) {