我刚学会了Promise.all()的概念,并对其机制感到好奇。根据我对Promise的有限知识,它在.then()方法中传递一个回调函数,并在定义中调用它。例如:
var p = new Promise((resolve) => {
setTimeout(resolve, 2000);
setTimeout(() => {
console.log('4 sec function');
}, 4000);
});
p.then(() => {
console.log('2 sec function');
});
// result:
// 2 sec function
// 4 sec function
但是,当我们使用Promise.all()
时,它会在所有承诺都完成后触发回调。正如我的猜测,它触发了最后履行的承诺中的回调。在下面的例子中,我对结果的看法是“四”。但是,它会打印四个数字的数组。为什么会这样?更具体地说:
实际触发回调的次数是多少次?
promises定义中的哪个位置是触发回调?
传递给回调的值是什么?
以下是我研究的代码:
var p1 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, 'one');
});
var p2 = new Promise((resolve, reject) => {
setTimeout(resolve, 2000, 'two');
});
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 3000, 'three');
});
var p4 = new Promise((resolve, reject) => {
setTimeout(resolve, 4000, 'four');
});
Promise.all([p1, p2, p3, p4]).then(values => {
console.log(values);
});
// print:
// one
// two
// three
// four
答案 0 :(得分:1)
回调被触发一次。
当所有承诺得到解决或其中一个失败时。
它接收所有承诺解析为的值的数组。
答案 1 :(得分:0)
<强> Promise.race
强>
还有Promise.race
,只要承诺的第一次 resolve
或reject
p1
,p2
,p3
或p4
)解析或拒绝
// note: i've adjusted the delays from your original code
var p1 = new Promise((resolve, reject) => {
setTimeout(resolve, 4000, 'one');
});
var p2 = new Promise((resolve, reject) => {
setTimeout(resolve, 3000, 'two');
});
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 2000, 'three');
});
var p4 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, 'four');
});
Promise.race([p1, p2, p3, p4]).then(fastest => {
console.log(fastest); // four
});