javascript - 两个并行调用,其中一个在 JavaScript 中成功

标签 javascript asynchronous

我想要像async库这样的东西来执行两个并行调用,其中一个在javascript中成功,然后回调对成功的输出进行操作。 async 似乎没有这个功能。如果其中任何一个失败,parallel 就会出错。

一般来说,如果我有 N 个任务,并且我想保证 m 成功并使用这些 m 调用的输出,如何我能做到吗?

最佳答案

Promise.race

您想要Promise.race(假设您愿意从async转向Promise):

Promise.race([d1, d2]) . then(result =>

来自MDN :

The Promise.race method returns a promise that resolves or rejects as soon as one of the promises in the iterable resolves or rejects, with the value or reason from that promise.

以回调方式编写race

据我所知,async 没有提供与竞赛相当的功能,但你可以这样做:

async.race = function(tasks, callback) {
  var done = false;
  tasks.forEach(function(task) {
    task(function(err, data) {
      if (done) return;            // another task finished first
      done = true;
      callback(err, data);
    });
  });
};

也许您想要一个忽略错误的 race 变体——尽管这种设计似乎有问题。在这种情况下:

async.firstFulfilled = function(tasks, callback) {
  var done = false;
  tasks.forEach(function(task) {
    task(function(err, data) {
      if (err || done) return;    // skip failures
      done = true;
      callback(err, data);
    });
  });
};

返回前 n 个非错误案例:

async.firstNFulfilled = function(n, tasks, callback) {
  var result = [];
  tasks.forEach(function(task) {
    task(function(err, data) {
      if (err) return;
      result.push(data);
      if (!--n) callback(null, result);
    });
  });
};

关于javascript - 两个并行调用,其中一个在 JavaScript 中成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32643593/

相关文章:

javascript - JS 异步函数返回未定义,尽管在异步函数内调用它

c# - 在异步方法中省略异步和等待

javascript - Vue 3 数据不可回溯

javascript - 构造函数的对象字面量返回 toString() 方法,但不返回其他方法

javascript - jquery flot 在 200% 中绘制点以为它说值是 100%

JavaScript curry 函数

c# - C# 中是否有类似 ConcurrentQueue 的数据结构,它允许我等待一个空队列,直到添加一个项目?

javascript - 在两列 Highcharts 中显示图例项

php - 在 Windows 机器上的 PHP 中长时间运行的后台进程

javascript - onChange 是延迟一个字符 - Hooks