1

Async.js で並列関数を使用していますが、何らかの理由で最終的なコールバックが実行されず、どこにもエラーが発生していません。

並列呼び出しに渡される関数の配列を動的に作成しています。

// 'theFiles' is an array of files I'm working with in a code-generator style type of scenario
var callItems = [];
theFiles.forEach(function(currentFile) {

      var genFileFunc = generateFileFunc(destDir + "/" + currentFile, packageName, appName);

      callItems.push(genFileFunc(function(err, results) {
        if(err) {
          console.error("*** ERROR ***" + err);
        } else {
          console.log("Done: " + results);  
        }

      }));

    });

    async.parallel(callItems, function(err, results) {
      console.log(err);
      console.log(results);
      if(err) {
        console.error("**** ERROR ****");
      } else {
        console.log("***** ALL ITEMS HAVE BEEN CALLED WITHOUT ERROR ****");  
      }
    });

次に、外側の関数 (上記の forEach を実行している関数の外側) に、generateFileFunc() 関数があります。

// Function that returns a function that works with a file (modifies it/etc). 
function generateFileFunc(file, packageName, appName) {
  return function(callback) {
    generateFile(file, packageName, appName, callback);
  }
}

私はこのSOの投稿を見てきましたが、それは私が今いる場所にたどり着くのに役立ちました. ただし、最後のコールバックは実行されていません。ただし、並列呼び出しのすべてのアイテムが実行されています。最下部の gnerateFile (関数) の内部で、コールバックを呼び出します。

なぜこれが適切に実行されないのか、誰にも分かりますか?

最終結果は、各関数呼び出しを並行して処理し、完了時に通知されるため、他の命令の実行を続行できます。

ありがとう!

4

3 に答える 3

4

次から始めて、行ごとに何が起こっているかを分析します。

var genFileFunc = generateFileFunc(...);

あなたの関数generateFileFuncは関数を返すので、変数genFileFuncは次の関数です

genFileFunc === function(callback) {
    generateFile( ... );
};

これで、この関数が何も返さないことは明らかです(returnステートメントはありません)。そして明らかに、私は JavaScript の組み込み定数を何も理解していません。undefined特にあなたが持っている

genFileFunc(function(err, results) { ... } ) === undefined

これはそれを呼び出した結果です。したがって、 にプッシュundefinedcallItemsます。うまくいかないのも不思議ではありません。

何が正確に何をするのかを知らずにこれを修正する方法を伝えるのは難しいですgenerateFileが、とにかく試してみます. 単純にこれを試してください:

callItems.push(genFileFunc);

関数の結果である ではなく、関数をにプッシュする必要があるためです。callItemsundefined

于 2012-09-09T19:41:19.890 に答える
2

奇妙。

これまでの最良の推測: generateFile 内で、呼び出す代わりに RETURN コールバック。

于 2012-09-09T19:30:49.887 に答える
1

あなたはで述べられた目標を達成することができます

async.map(theFiles, function(file, done) {
  generateFile(destDir + "/" + file, packageName, appName, done);
}, function(err, res) {
  // do something with the error/results
});
于 2012-09-09T21:10:46.270 に答える