2017-01-12 16 views
2

まず、私はnodejsを初めて使用しています。私は各ループの中で複数のクエリを実行する必要があるAPIの作業。ですから、私はexpressでasyncモジュールを使い始めました。あなたは、私が非同期モジュールを使用してオブジェクトを移入しようとしています見ることができるように、私が使用しています正確なコードはnodejs非同期の並列非同期内部

 new_or_updated = {}; 
     async.each(rows, function(e, callbackParent) { 
      new_or_updated.id = e.id; 
      async.parallel([ 
       function(callback){ 
        db.query("SELECT sender_string FROM filter_positive_rules_sender WHERE rule_id = ? AND is_deleted = 0", e.id,function(err, rows, fields){ 
         if (err) { 
          return callback(err); 
         } 
         new_or_updated.sender = rows.map(x => x.sender_string); 
         callback(null); 
        }); 
       }, 
       function(callback){ 
        db.query("SELECT subject_string FROM filter_positive_rules_subject WHERE rule_id = ? AND is_deleted = 0", e.id ,function(err, rows, fields){ 
         if (err) { 
          return callback(err); 
         } 
         new_or_updated.subject = rows.map(x => x.subject_string); 
         callback(null); 
        }); 
       }, 
       function(callback){ 
        db.query("SELECT body_string FROM filter_positive_rules_body WHERE rule_id = ? AND is_deleted = 0", e.id ,function(err, rows, fields){ 
         if (err) { 
          return callback(err); 
         } 
         new_or_updated.body = rows.map(x => x.body_string); 
         callback(null); 
        }); 
       } 
      ], 
      function(err) { 
       if (err) { 
        res.status(500).json(
         "Internal server error" 
        ).send(); 
       } 
       console.log(new_or_updated): 
       callbackParent(null, new_or_updated); 
      }); 

     }, 
     function(err, result) { 
      if (err) { 
       res.status(500).json(
        "Internal server error" 
       ).send(); 
      } 
      console.log(result) 
     }); 

です。並列非同期でnew_or_updatedをコンソール化すると、配列が正しく構築されます。しかし、私は、各非同期コールバックに変数を送信し、それ(結果変数)をコンソール私は未定義になる。また、私がparentCallbackでnew_or_updatedをコンソール化するとき、配列内の1つの要素(各非同期モジュールを使用して最後の配列を構築する)だけを取得します。

私はここで間違っていますか?ネストされた非同期が実際に実際に動作するはずであることを誰かが私に説明できますか?

+0

値を格納するために、グローバル変数を使用することです。非同期操作を実行する関数外の変数を初期化してみてください。 – ArUn

+0

@ArUn new_or_updated変数は、両方の非同期の外で初期化されています。 –

+0

あなたはそのメイン関数の外でそれを初期化できますか? – ArUn

答えて

1

asyncのコードベースごとに、 "async.each"はコールバックで2つのパラメータを取るようには設計されていません。

常に1つの "エラー"(またはパラメータなし)のコールバックパラメータで呼び出されます。

また、グローバルオブジェクトのプロパティを "async.each"内に設定すると、非同期操作の場合にプロパティが上書きされます。これは、最初の反復で設定された "new_or_updated.id"の値が、 "async.each"の後続の反復によって上書きされる可能性があることを意味します。

ここでグローバルオブジェクト「new_or_updated」は、各オブジェクトの固有のプロパティ値を持つオブジェクトの配列である必要があります。各反復の値とコンテキストを "async.each"に保持するようにします。

0

コールバックに戻ります。 私はasync.mapとasync.waterfallを使用しています 申し訳ありませんが、悪い英語の危険性、私は単なる初心者です。私はこのようなテスト

async.map(rows, function(e, callbackParent) { 
    async.waterfall([ 
     function(callback){ 
      db.query("SELECT sender_string FROM filter_positive_rules_sender WHERE rule_id = ? AND is_deleted = 0", e.id,function(err, rows, fields){ 
       if (err) { 
        return callback(err); 
       } 
       e.sender = rows.map(x => x.sender_string); 
       callback(null, e); 
      }); 
     }, 
     function(Obj, callback){ 
      db.query("SELECT subject_string FROM filter_positive_rules_subject WHERE rule_id = ? AND is_deleted = 0", e.id ,function(err, rows, fields){ 
       if (err) { 
        return callback(err); 
       } 
       Obj.subject = rows.map(x => x.subject_string); 
       callback(null, Obj); 
      }); 
     }, 
     function(Obj, callback){ 
      db.query("SELECT body_string FROM filter_positive_rules_body WHERE rule_id = ? AND is_deleted = 0", e.id ,function(err, rows, fields){ 
       if (err) { 
        return callback(err); 
       } 
       Obj.body = rows.map(x => x.body_string); 
       callback(null, Obj); 
      }); 
     } 
    ], 
    function(err, result) { 
     callbackParent(err, result); 
    }); 
}, 
function(err, result) { 
    if (err) { 
     res.status(500).json(
      "Internal server error" 
     ).send(); 
    } 
    res.send(result) 
}); 

は仕事

function test(callback) { 
    callback([ 
     { 
      'name':'Anu' 
     }, 
     { 
      'name':'hem' 
     } 
    ]); 
} 
test(function(aaaaaaaaaaa) { 
    async.map(aaaaaaaaaaa, function(e, callbackParent) { 
     async.waterfall([ 
      function(callback) { 
       e.number = 123; 
       return callback(null, e); 
      }, 
      function(obj, callback) { 
       obj.kelas = '1'; 
       return callback(null, obj); 
      } 
     ], function(eerr, r) { 
      callbackParent(eerr, r); 
     }); 
    }, function(erro, ok) { 
     res.send(ok); 
    }); 
}); 
関連する問題