Javascript 在node.js中,返回一组N个异步调用的第一个/最快的M个结果的最有效方法是什么?
我正在对N个输入的列表应用一个慢速异步谓词函数(它调用一个外部HTTP API)。我只需要任何M(其中M如果您希望函数在所有操作完成之前返回,那么我认为您不能使用async#map。此外,async不提供任何API来取消正在运行的任务 我是这样做的。每个迭代器都可以返回一个中止函数。它可以简单到:Javascript 在node.js中,返回一组N个异步调用的第一个/最快的M个结果的最有效方法是什么?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我正在对N个输入的列表应用一个慢速异步谓词函数(它调用一个外部HTTP API)。我只需要任何M(其中M如果您希望函数在所有操作完成之前返回,那么我认为您不能使用async#map。此外,async不提供任何API来取消正在运行的任务 我是这样做的。每个迭代器都可以返回一个中止函数。它可以简单到: function (input, done) { var req = http.createClient(); … return function () { req.abort(
function (input, done) {
var req = http.createClient();
…
return function () {
req.abort();
}
}
如果您正在执行HTTP请求
function asyncMapFastest(arr, m, iterator, done) {
var remaining = m,
results = {},
aborts = [],
finished = false;
function abortStillRunning() {
finished = true;
aborts.forEach(function (abort) {
if (abort)
abort();
});
aborts = [];
}
arr.forEach(function (input, i) {
var abort = iterator(input, function (err, result) {
if (finished)
return;
if (err) {
abortStillRunning();
return done(err);
}
remaining--;
results[input] = result;
aborts[i] = null;
if (remaining === 0) {
abortStillRunning();
return done(null, results);
}
});
aborts[i] = abort;
});
}
是否要立即启动所有N个异步操作,并在找到结果正确的M时取消其余操作?还是只希望在任何给定时间执行X个异步操作(其中X
function asyncMapFastest(arr, m, iterator, done) {
var remaining = m,
results = {},
aborts = [],
finished = false;
function abortStillRunning() {
finished = true;
aborts.forEach(function (abort) {
if (abort)
abort();
});
aborts = [];
}
arr.forEach(function (input, i) {
var abort = iterator(input, function (err, result) {
if (finished)
return;
if (err) {
abortStillRunning();
return done(err);
}
remaining--;
results[input] = result;
aborts[i] = null;
if (remaining === 0) {
abortStillRunning();
return done(null, results);
}
});
aborts[i] = abort;
});
}