平行赛
您可以通过返回一个评估为true 但实际上不是错误的error 来让async 启动最终回调。
我整理了一个使用-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 设置为像这样工作时,您将无法访问其他异步函数的结果。如果您只对第一个响应的人感兴趣,那么这不是问题。但是,您将无法取消其他请求。这很可能不是问题,但可能是一个考虑因素。