0

NodeJSで非同期モジュールを初めて使用しようとしていますが、async.parallel関数を実行するための関数の配列を動的に構築しようとすると、問題が発生します。

    methods = [];
    for (key in entries) {
      methods.push(function(callback) {
        return callback(null, key);
      });
    }
    return async.parallel(methods, function(err, results) {
      console.log(results);
      return render_views(req, res, 'view_blog_all', {
        entries: entries
      });
    });

私が見続ける出力は次のとおりです。

    [ 'powerful_sms_communication_for_teams',
  'powerful_sms_communication_for_teams',
  'powerful_sms_communication_for_teams' ]

そして、私がループしている私の「エントリ」オブジェクトには、間違いなく3つの異なるキーがあります。私が欠けているものはありますか?

非同期モジュール: https ://github.com/caolan/async

4

2 に答える 2

3

これは、非同期ロジックで遭遇する一般的な問題です。重要なのは、を呼び出すまでコールバックは実行されずasync.parallel、その時点でkeyループの最後のキー値になることを覚えておくことです。

これを解決する1つの方法は、IIFEを使用して新しいスコープ内のキー値をキャプチャすることです。

methods = [];
for (key in entries) {
  (function(key){
    methods.push(function(callback) {
      return callback(null, key);
    });
  })(key);
}

async.map代わりに、通常の配列と単一のイテレータで使用することもできます。

return async.map(
  entries,
  function(key, callback){
    callback(null, key);
  },
  function(err, results) {
    console.log(results);
    return render_views(req, res, 'view_blog_all', {
      entries: entries
    });
  }
);
于 2013-02-07T06:59:57.733 に答える
2

https://github.com/caolan/async#mapを使用して書き直します

async.map(entries, function(entry, callback) {
  //do your stuff, fully parallel and async ;)
  callback(null, entry);
}, function(err, results) {
  console.log(results);
  return render_views(req, res, 'view_blog_all', {
    entries: entries
  });
});
于 2013-02-07T07:08:41.983 に答える