我的问题是,为什么从这批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']
答案 0 :(得分:0)
承诺旨在存储未来结果(上述res()
的参数)或未来错误(rej()
的参数)以上),但不能同时使用。因此,在Promise正文中同时调用res()
和rej()
都是无效的。
在此示例中,当尝试解析a
和b
的将来值时,Promise.all
返回的promise将调用传递给then()
的函数或函数根据catch()
或a
的分辨率或拒绝率传递给b
。
通常,它将使用包含第一个值的列表来调用传递给then()
的函数,用该列表可以解析a
和b
。但是,如果其中一个承诺在解决之前被拒绝,则Promise.all
返回的承诺将调用传递给.catch()
的函数。
由于a
承诺始终得到解决,并且由于b
承诺首先得到解决 ,并且使用值car
,{{1} }将使用包含Promise.all([a,b])
的值进行解析。它不会拒绝使用值car
,因为bar
首先解析。
尽管浏览器提供的Promise实现可以静默处理两次拒绝/解决,但请注意,这可能会导致不确定的行为。例如,以这种方式使用时,b
的某些实现将引发异常。