掌握Promise 方法及应用,用更优雅的方式编写异步代码
2023-11-05 03:05:10
在上一篇文章中,我们已经学习了 Promise 的 then、catch 和 finally 方法,这些方法都是定义在 Promise 的原型上的。今天,我们将继续学习 Promise 实例上的其他方法,包括 all、race、allsettled 和 any。掌握这些方法将使您能够以更优雅的方式编写异步代码,从而提升 JavaScript 开发效率。
Promise.all() 方法
Promise.all() 方法用于将多个 Promise 实例包装成一个新的 Promise 实例。这个新的 Promise 实例将在所有包装的 Promise 实例都执行完后才执行。如果其中任何一个包装的 Promise 实例被拒绝,那么这个新的 Promise 实例也会被拒绝,并且包装的 Promise 实例的第一个拒绝原因将作为这个新的 Promise 实例的拒绝原因。
语法:
Promise.all(iterable)
参数:
- iterable:一个 Promise 实例的可迭代对象。
返回值:
一个新的 Promise 实例。
示例:
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Promise 1 resolved');
}, 1000);
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Promise 2 resolved');
}, 2000);
});
Promise.all([promise1, promise2]).then((result) => {
console.log(result); // ['Promise 1 resolved', 'Promise 2 resolved']
});
在上面的示例中,我们创建了两个 Promise 实例,promise1 和 promise2。然后,我们使用 Promise.all() 方法将它们包装成一个新的 Promise 实例。当两个包装的 Promise 实例都执行完后,新的 Promise 实例才会执行。然后,新的 Promise 实例的 then() 方法会被调用,并将一个包含两个包装的 Promise 实例的结果的数组作为参数传递给 then() 方法。
Promise.race() 方法
Promise.race() 方法用于将多个 Promise 实例包装成一个新的 Promise 实例。这个新的 Promise 实例将在第一个包装的 Promise 实例执行完后立即执行。如果其中任何一个包装的 Promise 实例被拒绝,那么这个新的 Promise 实例也会被拒绝,并且包装的 Promise 实例的第一个拒绝原因将作为这个新的 Promise 实例的拒绝原因。
语法:
Promise.race(iterable)
参数:
- iterable:一个 Promise 实例的可迭代对象。
返回值:
一个新的 Promise 实例。
示例:
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Promise 1 resolved');
}, 1000);
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Promise 2 resolved');
}, 2000);
});
Promise.race([promise1, promise2]).then((result) => {
console.log(result); // 'Promise 1 resolved'
});
在上面的示例中,我们创建了两个 Promise 实例,promise1 和 promise2。然后,我们使用 Promise.race() 方法将它们包装成一个新的 Promise 实例。当第一个包装的 Promise 实例执行完后,新的 Promise 实例就会立即执行。然后,新的 Promise 实例的 then() 方法会被调用,并将第一个包装的 Promise 实例的结果作为参数传递给 then() 方法。
Promise.allsettled() 方法
Promise.allsettled() 方法用于将多个 Promise 实例包装成一个新的 Promise 实例。这个新的 Promise 实例将在所有包装的 Promise 实例都执行完后才执行。与 Promise.all() 方法不同的是,即使其中任何一个包装的 Promise 实例被拒绝,这个新的 Promise 实例也不会被拒绝。相反,这个新的 Promise 实例的 then() 方法将被调用,并将一个包含所有包装的 Promise 实例的结果和状态的对象数组作为参数传递给 then() 方法。
语法:
Promise.allsettled(iterable)
参数:
- iterable:一个 Promise 实例的可迭代对象。
返回值:
一个新的 Promise 实例。
示例:
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Promise 1 resolved');
}, 1000);
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('Promise 2 rejected');
}, 2000);
});
Promise.allsettled([promise1, promise2]).then((result) => {
console.log(result); // [{status: 'fulfilled', value: 'Promise 1 resolved'}, {status: 'rejected', reason: 'Promise 2 rejected'}]
});
在上面的示例中,我们创建了两个 Promise 实例,promise1 和 promise2。然后,我们使用 Promise.allsettled() 方法将它们包装成一个新的 Promise 实例。当两个包装的 Promise 实例都执行完后,新的 Promise 实例就会执行。然后,新的 Promise 实例的 then() 方法会被调用,并将一个包含两个包装的 Promise 实例的结果和状态的对象数组作为参数传递给 then() 方法。
Promise.any() 方法
Promise.any() 方法用于将多个 Promise 实例包装成一个新的 Promise 实例。这个新的 Promise 实例将在第一个包装的 Promise 实例执行完后立即执行。与 Promise.race() 方法不同的是,如果其中任何一个包装的 Promise 实例被拒绝,这个新的 Promise 实例将被拒绝,并且包装的 Promise 实例的第一个拒绝原因将作为这个新的 Promise 实例的拒绝原因。
语法:
Promise.any(iterable)
参数:
- iterable:一个 Promise 实例的可迭代对象。
返回值:
一个新的 Promise 实例。
示例:
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Promise 1 resolved');
}, 1000);
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('Promise 2 rejected');
}, 2000);
});
Promise.any([promise1, promise2]).then((result) => {
console.log(result); // 'Promise 1 resolved'
}).catch((error) => {
console.error(error); // 'Promise 2 rejected'
});
在上面的示例中,我们创建了两个 Promise 实例,promise1 和 promise2。然后,我们使用 Promise.any() 方法将它们包装成一个新的 Promise 实例。当第一个包装的 Promise 实例执行完后,新的 Promise 实例就会立即执行。然后,新的 Promise 实例的 then() 方法或 catch() 方法会被调用,并将第一个包装的 Promise 实例的结果或拒绝原因作为参数传递给 then() 方法或 catch() 方法。