JavaScript中promise.all和promise.race的区别?
Promise.all
和 Promise.race
都是 JavaScript 中 Promise
对象的静态方法,它们用于处理多个 Promise
对象,但它们的行为和用途有所不同。
Promise.all
Promise.all
接收一个由 Promise
对象组成的数组(或类数组对象),并返回一个新的 Promise
。这个新的 Promise
会在所有输入的 Promise
都完成时才完成,并将其结果作为一个数组传递给 then
方法。如果输入的 Promise
数组中有一个 Promise
被拒绝,则返回的新的 Promise
也会立即被拒绝,并将其拒绝原因传递给 catch
方法。
示例:
const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'foo'));
const promise3 = fetch('https://api.github.com/users/github').then(response => response.json());
Promise.all([promise1, promise2, promise3]).then(values => {
console.log(values); // 所有 Promise 完成后,输出 [3, 'foo', 用户数据]
}).catch(error => {
console.error(error); // 如果有 Promise 被拒绝,输出拒绝原因
});
Promise.race
Promise.race
同样接收一个由 Promise
对象组成的数组(或类数组对象),并返回一个新的 Promise
。这个新的 Promise
会在输入的 Promise
数组中任意一个 Promise
完成或失败时立即完成或失败,并将其结果或拒绝原因传递给 then
或 catch
方法。
示例:
const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 500, 'one'));
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'two'));
Promise.race([promise1, promise2]).then(value => {
console.log(value); // 输出 'two',因为 promise2 更快完成
}).catch(error => {
console.error(error); // 如果有 Promise 被拒绝,输出拒绝原因
});
区别总结
Promise.all
等待所有Promise
都完成,并返回一个包含所有结果的数组。如果任何一个Promise
被拒绝,整个Promise.all
也会被拒绝。Promise.race
只等待第一个完成或失败的Promise
,并将其结果或拒绝原因作为自己的结果或拒绝原因。
在实际应用中,Promise.all
通常用于需要所有异步操作都完成才能进行下一步的情况,而 Promise.race
则用于检测哪个异步操作最快完成或失败。
近期评论