IE11中的Promise.catch在polyfills中失败

时间:2017-08-29 17:44:04

标签: javascript polymer internet-explorer-11 es6-promise polyfills

我正在使用我的Polymer 2项目中的ES6,Promises和fetch。因为我需要支持至少IE11,我正在使用Babel(通过聚合物构建)和使用polyfills.io来进行polyfill fetch和Promise支持。我的polyfills.io导入发生在任何其他导入之前,如下所示:

<script src="https://cdn.polyfill.io/v2/polyfill.js?features=default,fetch&flags=gated"></script>

当我加载页面时,IE11控制台中会出现此错误:

SCRIPT438: Object doesn't support property or method 'catch'

查看我的代码,我唯一一次使用catch是在Promises中。例如:

loadSchemas() {
  return APP.client
    .search("+type:Schema")
    .then(result => {
      // Do things with results.
    })
    .catch(error => {
      // Deal with errors.
    });
}

如果删除了catch,页面加载时没有错误,但显然没有运行我的错误处理代码。

为什么这不按预期工作?它在Firefox,Chrome和Safari中运行良好。我尝试了许多不同的promise polyfills并且仍然遇到了同样的错误,所以我不认为这是一个polyfill bug。

2 个答案:

答案 0 :(得分:3)

因此,看起来catch是IE 9+中的保留字。我在https://github.com/lahmatiy/es6-promise-polyfill找到了这个信息:

  

catch是IE中的保留字&lt; 9,意思是promise.catch(func)抛出a   语法错误。要解决此问题,请使用字符串来访问   属性:

     

promise['catch'](function(err) { // ... });

     

或者改为使用.then

     

promise.then(undefined, function(err) { // ... });

如果我修改它以避免捕获,我的代码在IE11中工作,如下所示:

loadSchemas() {
  return APP.client
    .search("+type:Schema")
    .then(result => {
      // Do things with results.
    }, error => {
      // Deal with errors.
    });
}

答案 1 :(得分:1)

实际上,如果您导入/webcomponentsjs/webcomponents-lite.js polyfill(使用Polymer 2.x),它很可能会重写Promise polyfill。 而这个polyfill目前有一个未解决的问题&#34; catch&#34; :

  

https://github.com/webcomponents/webcomponentsjs/issues/837

建议的解决方法是:

  

将WebComponents polyfill的版本固定为1.0.7或更低。

我查看了Promise的webcomponents-lite polyfill,如果以下内容为false(我简化了写作),它们会替换Promise定义:

Nat.eq_dec

但是,即使您从其他来源导入Promise polyfill,它们也会呈现给Object.prototype.toString.call(window.Promise.resolve()) == "[object Promise]" ,因此会被替换。

注意:Promise的webcomponents-lite polyfill目前还没有公开"[object Object]"方法,也可能是由于Closure编译器的上述问题。

未解决此问题时建议的解决方法:

在Webcomponents polyfill之后加载polyfill。

Promise.all()