Tips:如果你已经清楚Polyfill,并在实战中已经使用,本文对你的作用不大!
先指出引出这个点的原因:因为最近开发中又又又遇到了一个bug!
测试er:在Chrome69版本有一处没达到预期。
复现bug后,报错信息如下:
我的内心是:Promise出bug啦? (。ì _ í。)
短暂的懵逼后,先排查是不是浏览器版本太低了不支持这个API。结果确实如此,Promise.allSettled从Chrome76才开始支持。
Chrome69:
Chrome118:
caniuse:
MDN:
问题很清晰了,该怎么解呢?第一反应是,像app强更一样,让用户使用高版本浏览器😂。(原谅我知识浅薄)
肯定是不妥,于是向强大的mentor请教。mentor了解完就说补一下这个API的Polyfill就好了。
我:什么泼力faì ( ̀⌄ ́) ?
于是我就得到了这样一段代码:
Promise.allSettled = Promise.allSettled || ((promises) => Promise.all(promises.map(p => p
.then(value => ({
status: 'fulfilled', value
}))
.catch(reason => ({
status: 'rejected', reason
}))
)));
诶,这代码咋这么眼熟?跟学习手写Promise的静态方法时的代码那么像?
一下子就悟了,原来这就是Polyfill,原来Polyfill就是垫片。😯
由此又联想了到了几点:
- 难怪面试时会考手写API,除了考察代码能力外,在实际业务中也会有用到的地方;
- js的原型在实战中还能这样玩;
- Babel除了语法转换外,对于API的填充想来也是如此,
- 对于低版本的浏览器可以这样做兼容处理。
从一次解bug了解到的Polyfill。
over ~
Y(^_^)Y