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该方法对每个项都执行。您只需为每个项目重写shared
fieldObject
的属性,这就是为什么您总是看到最新处理的
fieldObject.currencyId
。带有done回调的each()也不适用于我。产生了同样的结果。然而,每一个限制都起了作用。
async.eachLimit(currencyData, 1, function (eachCurrency, done) {