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

two parallel calls either one succeeds in javascript

本文关键字:一个 javascript 成功 两个 并行 调用      更新时间:2023-09-26

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

一般来说,如果我有N任务,并且我想保证m成功并使用这些m调用的输出,我该怎么做?

Promise.race

你想要Promise.race(假设你愿意从async转移到承诺):

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

Promise.race方法返回一个承诺,当可迭代对象中的一个承诺被解决或拒绝时,该承诺就会被解决或拒绝,并带有该承诺的值或原因。

用回调方式写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);
    });
  });
};

可以使用jQuery。Deferred和jQuery。何时实现这一点(也有其他承诺库)。

var d1 = $.Deferred();
var d2 = $.Deferred();
$.when( d1, d2 ).done(function ( v1, v2 ) {
   // this will execute only when both deferred objects are resolved
   // and the values passed to those for resolving will be available 
   // through v1 and v2
});
$.get('url1').success(function() { d1.resolve('value for v1') });
$.get('url2').success(function() { d2.resolve('value for v2') });

jQuery。当:https://api.jquery.com/jQuery.when/

jQuery。延迟:https://api.jquery.com/category/deferred-object/