导语:
对于初学者,理解并应用 Promise 已是一大挑战;但当你熟悉了基础后,Promise 的进阶用法将助你提升代码质量至新的境界。本文将引导你走进 Promise 的进阶领域,让异步编程更上一层楼。
一、Promise.all()
在某些场景中,我们需要确保多个异步操作全部完成后再进行下一步。Promise.all()
可以帮助我们实现这一需求。
let promise1 = fetch('api1');
let promise2 = fetch('api2');
let promise3 = fetch('api3');
Promise.all([promise1, promise2, promise3]).then(values => {
console.log(values); // 所有API的返回值数组
}).catch(err => {
console.error(err); // 任何一个失败,都会进入此catch
});
二、Promise.race()
与 Promise.all()
相反,有时我们希望多个异步操作中只要有一个完成,就立刻进行下一步。这时 Promise.race()
就派上了用场。
let timeout = new Promise((resolve, reject) => {
setTimeout(reject, 5000, 'Request timed out');
});
let fetchRequest = fetch('some-api');
Promise.race([timeout, fetchRequest]).then(data => {
console.log(data); // api返回的数据
}).catch(err => {
console.error(err); // 超时或其他失败原因
});
三、Promise.allSettled()
当我们关心多个异步操作的全部结果(无论成功还是失败),但不需要它们全部成功才进入下一步,我们可以使用 Promise.allSettled()
。
let promise1 = fetch('api1');
let promise2 = fetch('non-existent-api');
let promise3 = fetch('api3');
Promise.allSettled([promise1, promise2, promise3]).then(results => {
results.forEach(result => {
if (result.status === 'fulfilled') {
console.log(result.value);
} else {
console.error(result.reason);
}
});
});
四、Promise.any()
Promise.any()
是一个较新的特性,它接受一个 Promise 的可迭代对象作为参数,当其中的任何一个 Promise 完成(fulfills)时返回,若全部失败,则抛出一个 AggregateError
。
let promise1 = Promise.reject('1st failure');
let promise2 = Promise.reject('2nd failure');
let promise3 = fetch('some-working-api'); // 假设这是一个正常工作的API
Promise.any([promise1, promise2, promise3]).then(data => {
console.log(data); // api返回的数据
}).catch(err => {
console.error(err); // 所有Promise失败的原因
});
五、错误处理的艺术
正确处理错误是编写健壮代码的关键。Promise 提供了多种错误处理机制。为了避免常见的 “unhandled promise rejection” 错误,始终确保在 Promise 链的末尾有一个 catch()
。
六、结语
随着 Promise 的广泛应用,其相关的 API 和特性也在不断地发展。为了编写更加健壮、高效的异步代码,深入理解并灵活应用 Promise 的进阶特性是至关重要的。