在前端开发中,我们经常使用 Promise 对象来处理异步操作,而 Promise.prototype.finally() 方法是一个在 Promise 执行结束时无论其结果如何都会执行的方法,可用于清除任何在 Promise 链中残留的资源。但是该方法在旧版本的浏览器中可能不被支持,因此为了兼容性,需要进行 Polyfill 实现。
Polyfill 实现
方法一:使用 Generator 函数
利用 Generator 函数来实现 Promise.prototype.finally(),其实现步骤如下:
- 定义一个 Generator 函数,函数中使用 yield 暂停代码执行,并返回一个 Promise 对象
- 在 yield 函数体中调用 Promise.then() 方法来处理 resolve 结果,Promise.catch() 方法来处理 reject 结果
- 在 finally 函数中,使用 return 命令将最终结果返回
示例代码如下:
-- -------------------- ---- ------- --------- -------- ---- - --- - ----- ---------------------- - ----- --- - ----- ------------------ - ------- - ------- - - -- ---------------------------- - ------------------------- - -------- ---- - ------ ----------------- -- - ------ ------------- -- -------- -- - ------ ------------- --- -- -
方法二:使用 Promise.resolve()
该方法的实现利用 Promise.resolve() 方法来实现 Promise.prototype.finally(),其主要思路如下:
- 定义一个 Promise 对象,在 Promise 对象中利用 Promise.resolve() 方法来处理 Promise 链中传递的值快速返回一个 promise 对象,同时在 finally 函数中调用 resolve() 方法来返回一个 Promise 对象
- 将该 Promise 对象与当前的 Promise 链进行拼接,来实现实现 Promise.prototype.finally() 方法的扩展
示例代码如下:
-- -------------------- ---- ------- -- ---------------------------- - ------------------------- - -------- ---------- - ----- ----------- - ----------------- ------ ---------- ------- -- --------------------------------------- -- ------- -------- -- --------------------------------------- -- - ----- ------- -- -- -- -
总结
在实际开发中,由于 Promise.prototype.finally() 方法不是所有浏览器均支持,而为了更好的兼容性,我们需要学会 Polyfill 实现。上述介绍的两种方法都是实现 Promise.prototype.finally() 方法的可行方案,具体实现根据场景的不同选择不同的方法,以便更好的适应开发需求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f93766f6b2d6eab30c82cb