Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在node.js中,返回一组N个异步调用的第一个/最快的M个结果的最有效方法是什么?_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript 在node.js中,返回一组N个异步调用的第一个/最快的M个结果的最有效方法是什么?

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(

我正在对N个输入的列表应用一个慢速异步谓词函数(它调用一个外部HTTP API)。我只需要任何M(其中M如果您希望函数在所有操作完成之前返回,那么我认为您不能使用async#map。此外,async不提供任何API来取消正在运行的任务

我是这样做的。每个迭代器都可以返回一个中止函数。它可以简单到:

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个异步操作(其中Xfunction 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; }); }