AJAX-Promise.all方法-意外的输出困境

时间:2019-05-04 03:02:38

标签: javascript promise

我的问题是,为什么从这批ajax代码中会有两个预期的输出,但是当我在调试器/控制台面板中进行测试时,这只会给我[foo,car]作为输出?

const a = new Promise((res, rej) => { //n1
  setTimeout(() => res('foo'), 300);
});

const b = new Promise((res, rej) => {
  setInterval(() => rej('bar'), 100);
  res('car');
});

Promise.all([a, b]).then((race) => {
  console.log(race);
}).catch((crash) => {
  console.log(crash);
});

正确答案:

[foo, car] 
['bar', 'car']
  • 为什么这样?

1 个答案:

答案 0 :(得分:0)

承诺旨在存储未来结果(上述res()的参数)未来错误(rej()的参数)以上),但不能同时使用。因此,在Promise正文中同时调用res()rej()都是无效的。

在此示例中,当尝试解析ab的将来值时,Promise.all返回的promise将调用传递给then()的函数或函数根据catch()a的分辨率或拒绝率传递给b

通常,它将使用包含第一个值的列表来调用传递给then()的函数,用该列表可以解析ab。但是,如果其中一个承诺在解决之前被拒绝,则Promise.all返回的承诺将调用传递给.catch()的函数。

由于a承诺始终得到解决,并且由于b承诺首先得到解决 ,并且使用值car,{{1} }将使用包含Promise.all([a,b])的值进行解析。它不会拒绝使用值car,因为bar首先解析。

尽管浏览器提供的Promise实现可以静默处理两次拒绝/解决,但请注意,这可能会导致不确定的行为。例如,以这种方式使用时,b的某些实现将引发异常。