面试题答案
一键面试- 兼容性检测:
- 使用特性检测来判断当前环境是否支持
Promise.prototype.finally
。
if (typeof Promise.prototype.finally!== 'function') { // 不支持,进行polyfill }
- 使用特性检测来判断当前环境是否支持
- Polyfill 实现:
- 为
Promise.prototype.finally
提供一个 polyfill。
if (typeof Promise.prototype.finally!== 'function') { Promise.prototype.finally = function (callback) { const P = this.constructor; return this.then( value => P.resolve(callback()).then(() => value), reason => P.resolve(callback()).then(() => { throw reason; }) ); }; }
- 为
- 性能考虑:
- 由于 polyfill 只是在不支持的环境下添加方法,所以在支持
finally
的现代环境中,不会有额外的性能开销。 - 而在旧环境中,
finally
的 polyfill 是基于现有的then
方法实现,虽然多了一些函数调用,但这是目前实现兼容性的常见方式,整体性能影响相对较小。
- 由于 polyfill 只是在不支持的环境下添加方法,所以在支持
- 代码可维护性:
- 将 polyfill 放在项目的入口文件或者专门的兼容性处理文件中,这样可以集中管理兼容性代码,便于后续维护和更新。
- 如果后续环境都支持
finally
了,可以直接删除该 polyfill 代码,对其他业务代码影响较小。
通过上述策略,能在保证 Promise.finally
功能在不同环境下正常使用的同时,兼顾性能和代码可维护性。