web-dev-qa-db-ja.com

Node.js-非同期ライブラリの使用-オブジェクトでのasync.foreach

私はnode asynclib- https://github.com/caolan/async#forEach を使用しています。オブジェクトを反復処理し、そのインデックスキーを出力します。完了したら、コールバックを実行します。

ここに私がこれまで持っているものがありますが、'iterating done'は見られません:

    async.forEach(Object.keys(dataObj), function (err, callback){ 
        console.log('*****');

    }, function() {
        console.log('iterating done');
    });  
  1. 最終関数が呼び出されないのはなぜですか?

  2. オブジェクトインデックスキーを印刷するにはどうすればよいですか?

52
Ben

最後の関数は、async.forEachでは、すべての要素に対してcallback関数を呼び出す必要があります。

次のようなものを使用します。

async.forEach(Object.keys(dataObj), function (item, callback){ 
    console.log(item); // print the key

    // tell async that that particular element of the iterator is done
    callback(); 

}, function(err) {
    console.log('iterating done');
});  
121
stewe

async.eachは、Async Libが提供する非常に便利で強力な機能です。3つのフィールドがあります。コールバックはオプションです。コールバックを提供している場合は、フロントエンドで表示したい応答または結果を返します

関数iterateeをcoll内の各アイテムに並行して適用します。反復子は、リストのアイテムと、終了したときのコールバックで呼び出されます。繰り返し対象がコールバックにエラーを渡すと、(各関数の)メインコールバックがすぐにエラーとともに呼び出されます。

この関数は各アイテムにiterateeを並列に適用するため、iteratee関数が順番に完了する保証はありません。

 var updateEventCredit = function ( userId, amount ,callback) {
    async.each(userId, function(id, next) {
    var incentiveData = new domain.incentive({
    user_id:userId,
        userName: id.userName,
        amount: id.totalJeeneePrice,
        description: id.description,
    schemeType:id.schemeType
    });

    incentiveData.save(function (err, result) {
        if (err) {
            next(err);
        } else {
                 domain.Events.findOneAndUpdate({
                    user_id: id.ids
                }, {
                    $inc: {
                        eventsCredit: id.totalJeeneePrice
                    }
                },{new:true}, function (err, result) {
                    if (err) {
                        Logger.info("Update status", err)
                        next(err);
                    } else {
                     Logger.info("Update status", result)
                     sendContributionNotification(id.ids,id.totalJeeneePrice);
                     next(null,null);       
                    }
                });
        }
    });
0
ngCourse