深入剖析 ES9:Promise.prototype.finally()
在 ES2018 中,JavaScript 引入了 Promise.prototype.finally() 方法。该方法允许在不管 Promise 对象的状态如何(fulfilled 或 rejected)都执行一段代码。在本文中,我们将深入探讨 ES9 中的 Promise.prototype.finally() 方法。
什么是 Promise?
Promise 是一种异步编程模式,它表示一个异步操作的最终结果。Promise 有三种状态:pending(等待中)、fulfilled(已成功)和 rejected(已失败)。一个 pending 的 Promise 对象可能会转变为 fulfilled 状态或 rejected 状态。通常情况下,我们可以使用 then() 方法来处理 fulfilled 状态的 Promise,使用 catch() 方法来处理 rejected 状态的 Promise。
Promise.prototype.finally() 方法
ES9 引入了 Promise.prototype.finally() 方法,它允许我们在 Promise 对象状态变为 fulfilled 或 rejected 时都能执行一段代码。Promise.prototype.finally() 方法接收一个回调函数,这个回调函数会在 Promise 对象状态变化时被调用。无论 Promise 对象状态是 fulfilled 还是 rejected,回调函数都会被执行。
Promise.prototype.finally() 调用后会返回一个 Promise 对象。如果回调函数返回一个 Promise 对象,则该 Promise 对象的状态和值将被用作返回 Promise 对象的值和状态。否则,返回 Promise 对象的状态为原来的状态,并且返回值未定义。
下面是一个简单的例子:
Promise.resolve("成功").finally(() => { console.log("Promise finally"); });
在这个例子中,Promise 对象由 Promise.resolve() 创建,并且传递给本应该在 fulfilled 状态时调用的 then() 方法的回调函数被放到了 finally() 方法中。无论 Promise 对象的状态如何,回调函数都会被执行,并在控制台上输出 "Promise finally"。
在下一个例子中,我们将展示回调函数返回一个 Promise 对象的情况:
Promise.resolve("成功").finally(() => { console.log("Promise finally"); return Promise.resolve("Promise resolve"); }).then(value => { console.log(value); });
在这个例子中,回调函数返回的是一个 fulfilled 状态的 Promise 对象,其值为 "Promise resolve"。因此,在上面的代码中将首先触发 Promise.prototype.finally() 中的回调函数,然后才会触发 then() 方法中的回调函数。运行这段代码,你将看到在控制台输出 "Promise finally" 和 "Promise resolve"。
Promise.prototype.finally() 的指导意义
Promise.prototype.finally() 方法是 Promise API 的一个重要成员。它使得在 Promise 对象状态变化时执行回调函数更加容易。使用 Promise.prototype.finally() 不仅可以简化代码,而且可以避免代码重复。此外,回调函数返回的 Promise 对象可以用于实现复杂的异步操作。
总结
在本文中,我们深入讨论了 ES9 中的 Promise.prototype.finally() 方法。我们了解到它可以在 Promise 对象状态变化时执行回调函数,并且回调函数返回的 Promise 对象可以用于实现复杂的异步操作。通过这篇文章,我们希望能够帮助您更加深入地了解 Promise API 并提高 JavaScript 异步编程技能。
参考文献:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally
- https://www.ecma-international.org/ecma-262/9.0/index.html#sec-promise.prototype.finally
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646c72cc968c7c53b0b6b85c