2

https://github.com/caolan/asyncを使用して並行して実行したいタスクのリストがあります。

これらの並列タスクのすべてではなく、最初のタスクが完了した後、プログラムを (おそらくコールバックを介して) 続行する必要があります。だから私はナイーブだとは思わない

async.parallel([task1, task2], callback)

私のために働きます。

別の方法として、2 つのタスクを生成し、未完了のタスクをキャンセルすることもできますが、非同期を使用してそれを行う方法もわかりません。

ありがとう!-チャーリー

4

2 に答える 2

6

パラレルレース

として評価されるが実際にはエラーではないをasync返すことで、最終的なコールバックを開始できます。errortrue

-1エラーコードとして使用する例をまとめました。最後のコールバックでerror値を確認し、そうでない場合-1は実際のエラーです。エラー値が の場合、-1に有効な値がありますresults。その時点で、resultsまだ完了していない他の非同期関数から余分な要素を削除する必要があります。

以下の例では、モジュールを使用しrequestて HTML ページをプルし、モジュールを使用underscoreして最終的なコールバックで結果をフィルタリングしています。

var request = require('request');
var _ = require('underscore');

exports.parallel = function(req, res) {
  async.parallel([
    /* Grab Google.jp */
    function(callback) {
      request("http://google.jp", function(err, response, body) {
        if(err) { console.log(err); callback(true); return; }
        callback(-1,"google.jp");
      });
    },
    /* Grab Google.com */
    function(callback) {
      request("http://google.com", function(err, response, body) {
        if(err) { console.log(err); callback(true); return; }
        callback(-1,"google.com");
      });
    }
    ],
    /* callback handler */
    function(err, results) {
      /* Actual error */
      if(err && err!=-1) {
        console.log(err);
        return;
      }
      /* First data */
      if(err===-1) {
        /*
         * async#parallel returns a list, one element per parallel function.
         * Functions that haven't finished yet are in the list as undefined.
         * use underscore to easily filter the one result.
         */
        var one = _.filter(results, function(x) {
          return (x===undefined ? false : true);
        })[0];
        console.log(results);
        console.log(one);
        res.send(one);
      }
    }
  );
};

残りの関数の結果

このように動作するようにセットアップasync#parallelすると、他の非同期関数の結果にアクセスできなくなります。最初に応答したものだけに関心がある場合、これは問題ではありません。ただし、その他のリクエストはキャンセルできません。それはおそらく問題ではありませんが、考慮事項になる可能性があります。

于 2013-06-01T03:23:24.483 に答える
1

async.parallelのドキュメントには次のように書かれています。

関数のいずれかがそのコールバックにエラーを渡すと、メインのコールバックがエラーの値ですぐに呼び出されます。

したがって、すべての並列ファンクターからエラー オブジェクトを返すことができ、最初に終了したファンクターが完了コールバックにジャンプします。おそらく独自の特別なエラー クラスでさえ、実際のエラーと「ちょっと勝った」エラーの違いを見分けることができます。

そうは言っても、並列関数を実行したままにして、コールバックの完了などを待機する可能性があります。おそらくasync.parallelLimit、あまりにも多くのタスクを並行して起動していないことを確認するために使用できますか?

そうは言っても、このタスクの非同期ライブラリから別の方法を試すことで、より良いサービスが提供される可能性があります。並列タスクを起動してから、これらのタスクを互いに競合させることは、最良のアイデアではない可能性があります。

于 2013-06-01T03:24:11.487 に答える