0

タスクがあり、既に完了している場合はスキップする必要があり、完了していない場合は実行する必要があります。タスクは非同期です。この後、別のタスクに対して同じチェックを行う必要があり、場合によってはそれを実行する必要があります...

if(!taskStatus.complete[x])
  asyncTasks[x](function(result){
    if(!taskStatus.complete[y])
      asyncTasks[y](function(result){
        stow(result);
      });
  });
if(!taskStatus.complete[y])
  asyncTasks[y](function(result){
    stow(result);
  });

つまり、最初のタスクが完了したかどうかに関係なく、2 番目のタスクを実行する必要がありますが、最初のタスクが完了した場合、2 番目のタスクはそれが完了するまで実行できません。

私のコードはここでかなり繰り返されていますが、これは一般的に非常に悪いことです。ノードのヒップネスにはやむを得ないのでしょうか。ノードはヒップすぎて DRY になりませんか?

4

1 に答える 1

1

promises を使用する必要があります (ここに promisesを実装する優れたライブラリがあります)。コードの非同期関数間の依存関係をエレガントに表すことができます。

promise を使用するように関数を変換する場合、特定のユース ケースの例を次に示します。

getSomeX()
.then(getSomeY)
.then(function(result) {
    stow(result);
})

stow()これは、Y が完了したときにのみ呼び出す必要があること、および Y が最初に X を必要とすることをうまく示しています。

関数をプロミスを使用するように変換する方法の例 (および対応するチュートリアル、サブセクションUsing Deferreds ) を次に示します。

var Q = require('q');
var getSomeX = function() {
    var deferred = Q.deferred();
    asyncTasks[x](function (result) {
        deferred.resolve(result);
    });
    return deferred.promise;
}

編集: Q の機能を使用して、Node の通常のコールバック スタイル (err、result) を尊重する非同期関数を次の関数で自動的に変換することもできますdenodeify

var getSomeX = Q.denodeify(asyncTasks[x]);
于 2013-11-16T16:43:28.733 に答える