2012-04-30 10 views
48

ノードasync lib-https://github.com/caolan/async#forEachを使用していて、オブジェクトを繰り返してインデックスキーを出力したいと考えています。完了したら、コールバックを実行したいと思います。ここでNode.js - 非同期のlib-async.foreachをオブジェクトと共に使用する

は、私がこれまで持っているものであるが、'iterating done'は見たことがないされています

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

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

  2. オブジェクトインデックスキーはどのように印刷できますか?

答えて

114

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'); 
}); 
+0

おかげで、私はそれが簡単な何かを知っていた@stewe! よろしく、ベン。 – Ben

+3

上記のコードはすべての反復で 'callback'関数を呼び出しませんか? 'count ++;のようなものでなければならない。 if(dataObj.length == count)callback(); '新しい変数' var count = 1; 'は' async.forEach'ループを呼び出す前に宣言されています? –

+1

ありがとうございました! –

0

async.eachは、非同期のLibによって提供される機能は3つのフィールド 1-コレクション/配列 2 - 反復 3-コールバックを持っている.IT非常に便利で強力です コレクションはオブジェクトの配列またはコレクションに参照され、反復は各反復を参照し、コールバックはオプションです。 コールバックを行っている場合は、フロントエンドに表示したい回答または結果を返します

関数collを各アイテムに並列に適用します。 iterateeはリストから項目を呼び出し、終了時のコールバックを呼び出します。 iterateeがそのコールバックにエラーを渡すと、(各関数の)メインコールバックがエラーとともに直ちに呼び出されます。

この関数は各項目にiterateeを並列に適用するので、iteratee関数が順番に完了するという保証はありません。

exapmle-

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);  
        } 
       }); 
     } 
    }); 
関連する問題