据我所知,有关于
promise
的两个选项:
> promise.all()
> promise.race()
好的,我知道promise.all()的作用.它并行运行promises,然后.then为两个值提供成功解析的值.这是一个例子:
Promise.all([ $.ajax({ url: 'test1.PHP' }),$.ajax({ url: 'test2.PHP' }) ]) .then(([res1,res2]) => { // Both requests resolved }) .catch(error => { // Something went wrong });
但是我不明白promise.race()应该做什么呢?换句话说,不使用它有什么区别?假设这个:
$.ajax({ url: 'test1.PHP',async: true,success: function (data) { // This request resolved } }); $.ajax({ url: 'test2.PHP',success: function (data) { // This request resolved } });
看到?我没有使用promise.race(),它的行为类似于promise.race().无论如何,是否有任何简单而干净的例子告诉我何时应该使用promise.race()?
解决方法
如您所见,race()将返回首先解析或拒绝的promise实例:
var p1 = new Promise(function(resolve,reject) { setTimeout(resolve,500,'one'); }); var p2 = new Promise(function(resolve,100,'two'); }); Promise.race([p1,p2]).then(function(value) { console.log(value); // "two" // Both resolve,but p2 is faster });
对于要使用的场景,您可能希望限制请求的成本时间:
var p = Promise.race([ fetch('/resource-that-may-take-a-while'),new Promise(function (resolve,reject) { setTimeout(() => reject(new Error('request timeout')),5000) }) ]) p.then(response => console.log(response)) p.catch(error => console.log(error))
随着比赛()你只需要得到回报的承诺,你不必关心比赛([])中的哪一个承诺首先归还,
但是,如果没有比赛,就像你的例子一样,你需要关心哪一个首先返回,并在成功回调中调用回调.