パラレルレース
として評価されるが実際にはエラーではないを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すると、他の非同期関数の結果にアクセスできなくなります。最初に応答したものだけに関心がある場合、これは問題ではありません。ただし、その他のリクエストはキャンセルできません。それはおそらく問題ではありませんが、考慮事項になる可能性があります。