在 ES9 中,Promise 新增了一个方法:Promise.prototype.finally()。该方法会在 Promise 对象结束时,无论是 resolve 还是 reject,都会执行一些操作。然而,由于该方法是 ES9 中新增的,所以在某些旧浏览器中并不支持该方法。
本文将介绍如何兼容 ES9 Promise.prototype.finally() 方法,并包含相关的示例代码。
解决方案
为了实现 ES9 Promise.prototype.finally() 方法的兼容性,我们可以通过以下两种方式:
手动实现
我们可以手动实现一个 Promise.prototype.finally() 方法。该方法可以使用 Promise.prototype.then() 和 Promise.prototype.catch() 方法来实现,例如:
-- -------------------- ---- ------- -- ---------------------------- - ------------------------- - -------- ---------- - --- - - ----------------- ------ ---------- ----- -- ----------------------------- -- ------- ------ -- ----------------------------- -- - ----- ------ -- -- - -
该兼容方案的原理是先调用原来的 Promise.prototype.then() 或 Promise.prototype.catch() 方法,然后在返回的新 Promise 对象中再调用 callback 函数。当步骤执行完毕后,我们需要在 then() 和 catch() 函数中返回原始的值或错误信息。通过这种方式,我们就可以兼容 ES9 Promise.prototype.finally() 方法。
使用 polyfill
除了手动实现之外,我们还可以使用 polyfill 库来兼容 ES9 Promise.prototype.finally() 方法。其中,为了兼容 ES9 Promise.prototype.finally() 方法,我们可以使用 promise-polyfill 库。该库可以在不支持 Promise 方法的浏览器上使用 Promise 对象,并可以模拟 ES9 Promise.prototype.finally() 方法。
例如:
require('promise-polyfill/dist/polyfill'); if (!Promise.prototype.finally) { Promise.prototype.finally = require('promise-polyfill/src/finally'); }
示例代码
以下是 Promise.prototype.finally() 的示例代码:
let promise = new Promise((resolve, reject) => { resolve('成功!'); }); promise .then(result => console.log(result)) .catch(error => console.log(error)) .finally(() => console.log('结束!'));
该示例中,我们首先创建了一个 Promise 对象,它会在 resolve() 方法中返回“成功!”字符串。然后,我们调用 Promise.prototype.then() 方法来打印“成功!”字符串。接着,我们调用 Promise.prototype.catch() 方法来捕获异常情况。最后,我们使用 Promise.prototype.finally() 方法,在 Promise 对象结束时打印“结束!”字符串。如果运行该示例,输出结果将为:
成功! 结束!
结论
ES9 Promise.prototype.finally() 方法为 Promise 对象提供了一种可以处理 Promise 对象结束时的代码。然而,该方法在某些旧浏览器中并不支持。通过手动实现或使用 polyfill 库,我们可以兼容 ES9 Promise.prototype.finally() 方法,让我们在处理 Promise 对象时更加方便和高效。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6706115dd91dce0dc857b98b