无法使用async.each()使用异步块异步迭代数组

时间:2018-06-10 15:35:23

标签: node.js asynchronous

我想为数组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()在异步块完成执行之前取值6。它实际上从未运行过值5的逻辑。

我认为这是async.each()有用的地方。但是,我无法使它发挥作用。使用async.forEachOf尝试但结果相同。

2 个答案:

答案 0 :(得分:0)

doc说:

  

将函数iteratee并行应用于coll中的每个项目。该   使用列表中的项目调用iteratee,并使用when的回调   它已经完成了。如果iteratee将错误传递给它的回调,那么   主要回调(对于每个函数)立即调用   错误。

     

注意,因为此函数将iteratee应用于每个项目   并行,不能保证iteratee函数会   按顺序完成。

我认为方法couponHandler.checkIFWalletExists未在代码中注释掉。这意味着迭代器将在完成第一个项目的处理之前开始处理第二个项目。并且可能因为第二项处理得更快,您会看到错误的顺序。

答案 1 :(得分:0)

您没有调用提供的"完成" -callback,因此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条件的else分支。

} else {
   done();
} 

如果您不希望同时处理这些项目,请改用async.eachLimit

async.eachLimit(currencyData, 1, function (eachCurrency, done) {