你知道Polyfill吗,很简单的

302 阅读1分钟

Tips:如果你已经清楚Polyfill,并在实战中已经使用,本文对你的作用不大!


先指出引出这个点的原因:因为最近开发中又又又遇到了一个bug!

测试er:在Chrome69版本有一处没达到预期。

复现bug后,报错信息如下: image.png

我的内心是:Promise出bug啦? (。ì _ í。)

短暂的懵逼后,先排查是不是浏览器版本太低了不支持这个API。结果确实如此,Promise.allSettledChrome76才开始支持。

Chrome69: image.png

Chrome118: image.png

caniuse: image.png

MDN: image.png


问题很清晰了,该怎么解呢?第一反应是,像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