Promise 是 JavaScript 中非常基础的概念,它是一种用于处理异步操作的机制。在 ECMAScript 2019 中,Promise API 也得到了不少的更新和增强。这篇文章将介绍 ECMAScript 2019 中的 Promise API,并给出一些有深度、有指导意义的示例代码,帮助读者更好的理解 Promise 的使用。
Promise 是什么?
简单来说,Promise 是一种代表一项异步操作完成或失败的对象。在创建一个 Promise 对象时,我们可以指定一个回调函数,这个回调函数将在异步操作完成时被触发。通过 Promise API,我们可以对异步操作的结果进行处理,以及对函数异步运行中的异常进行捕获和处理。
ECMAScript 2019 中的 Promise API
在 ECMAScript 2019 中,Promise API 也得到了诸多更新和增强。我们来逐一介绍一下这些新特性。
Promise.prototype.finally()
Promise.prototype.finally() 方法会注册一个回调函数,当 Promise 对象变为 resolved 或者 rejected 状态时都会执行该回调。这个方法返回原 Promise 对象的一个新的 Promise 实例。此方法不管 Promise 对象最终状态如何都会执行回调函数,可以用于处理一些无论当前状态如何都需要执行的最终逻辑。
// www.javascriptcn.com code example
// 使用 finally 处理清理逻辑
function doSomething() {
return something
.then(function (result) {
// 执行成功
})
.catch(function (err) {
// 执行失败
})
.finally(function () {
// 清理逻辑
})
}Promise.allSettled()
在之前,我们只能通过 Promise.all() 方法来等待多个 Promise 完成,返回所有 Promise 的结果。但是,Promise.all() 的问题在于它在有任何一个 Promise 失败时都会抛出异常并拒绝整个 Promise.all() 的结果。这导致了一些问题,因为我们可能会希望知道所有异步操作的结果,而不仅仅是成功的操作结果。在 ECMAScript 2019 中,我们还有一个新方法来解决这个问题,那就是 Promise.allSettled()。和 Promise.all() 不同,Promise.allSettled() 会忽略 Promise 的结果是否成功,而是返回所有 Promise 的结果状态。
// www.javascriptcn.com code example
// 使用 allSettled 等待多个 Promise 执行完毕
Promise.allSettled([
somePromise(),
someOtherPromise(),
finalPromise()
]).then(function ([result1, result2, result3]) {
console.log(result1.status);
console.log(result2.status);
console.log(result3.status);
})Promise.reject()
Promise.reject() 方法会以一个给定的 reason 值作为失败状态返回一个新的 Promise 对象。这个方法比 Promise.resolve() 更方便一些,因为它可以快速地抛出异常并拒绝 Promise 对象。
// 使用 Promise.reject() 抛出异常
new Promise(function (resolve, reject) {
reject(new Error('Oops! Something went wrong.'));
})
.catch(function (err) {
console.error(err.message);
});Promise.allSettled() 迭代穿透
在数组的 Promise 对象中,如果存在 Promise 对象被拒绝时,Promise.all() 和 Promise.race() 都会立即拒绝,并忽略其他 Promise 的状态。而 ECMAScript 2019 中的 Promise.allSettled() 在处理这种情况时更加友好。Promise.allSettled() 中的回调仍然会在数组中的每个 Promise 对象上触发,只是返回的数据中 then 和 catch 都为 undefined。
// 迭代穿透
Promise.allSettled([
Promise.resolve('Success!'),
Promise.reject('Failure!'),
Promise.resolve('Success!'),
]).then(function (results) {
console.log(results);
})结语
Promise 在 JavaScript 中扮演着重要的角色,可以让我们更方便地处理异步操作而不陷入回调地狱。而在 ECMAScript 2019 中,Promise API 也得到了很多有益的更新和增强,使得我们能够对异步处理进行更多的控制和操作。以上所述的 ECMAScript 2019 中的新特性,都是我们在进行前端开发的过程中需要注意并加以应用的。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d68cd0a941bf7134c55e86