如何在 Internet Explorer 11 中支持 Promise?

Posted

技术标签:

【中文标题】如何在 Internet Explorer 11 中支持 Promise?【英文标题】:How to support promises in Internet Explorer 11? 【发布时间】:2016-07-01 04:34:36 【问题描述】:

我有一个简单的代码,可以在除 Internet Explorer 11 之外的所有浏览器上完美运行。我怎样才能让它在所有浏览器上运行?

Codepen

'use strict';

let promise = new Promise((resolve, reject) => 

  setTimeout(() => 
    resolve("result");
  , 1000);
);

promise
  .then(
    result => 
      alert("Fulfilled: " + result);
    ,
    error => 
      alert("Rejected: " + error);
    
  );

【问题讨论】:

ie11没有es2015 IE11 既不支持arrow functions 也不支持native Promises。使用 JS 转译器(如 babel)或不使用 ES6 功能。对于 Promise 支持,您可以使用像 bluebird 这样的库。 (顺便说一句,注意caniuse.com 如何表明此代码也不会在 IE11 以外的其他浏览器中运行。养成检查您想要的 JS、CSS 或 html 功能的支持程度的习惯使用是。) 相关***.com/questions/27835687/… 如果你使用 Babeljs 来编译你的代码,你可以安装 "es2015-ie" 预设和 "babel-polyfill" npm 模块来解决这个与 IE 的兼容性问题,同时避免大量其他 IE 相关问题 【参考方案1】:

如果您希望这种类型的代码在 IE11 中运行(根本不支持大部分 ES6),那么您需要获得一个 3rd 方承诺库(如 Bluebird),包含该库并更改您的编码使用 ES5 编码结构(没有箭头函数,没有 let 等),这样你就可以在旧浏览器支持的范围内生活。

或者,您可以使用转译器(如 Babel)将您的 ES6 代码转换为可在旧版浏览器中运行的 ES5 代码。

这是您使用 Bluebird Promise 库以 ES5 语法编写的代码版本:

<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.3.4/bluebird.min.js"></script>

<script>

'use strict';

var promise = new Promise(function(resolve) 
    setTimeout(function() 
        resolve("result");
    , 1000);
);

promise.then(function(result) 
    alert("Fulfilled: " + result);
, function(error) 
    alert("Rejected: " + error);
);

</script>

【讨论】:

我想 jquery.defered 也可以使用,jquery.defered 可能从 ie 6+ 开始支持,这也是为什么 jquery defered 的原因,因为 jquery 是一个非常流行和有用的库,并且在大型项目中多次使用,包括JS 上的东西,其中大多数,如果他们使用库,那么他们大多也会使用 Jquery。所以你不需要为你的项目添加另一个依赖项,并且可以让你的团队领导/项目经理更快乐 @ShreyanMehta - 是的,可以使用 jQuery 承诺(及其非标准实现)代替 ES6 承诺语法,但 OP 似乎在询问是否使用 new Promise() 这不是语法jQuery 支持的。对于与旧版浏览器兼容但具有自己的非标准语法的其他承诺库(例如 Q)也是如此。 @ShreyanMehta 我不会只为 http 请求包含 jQuery。当像 Bluebird 或 Axios 这样更小、更专注的库会更好时,这是很多包袱。我认为现在没有人应该比其他库更喜欢 jQuery,除非项目已经在使用 jQuery。 @elliottregan 好吧,这对我来说是一个很好的学习。感谢您的反馈。 letconst 在 for 循环中不使用时可用于 ie11。它是 ei11 实际支持的唯一 es6 功能之一。 (有限的MapSet 以及其他一些杂项功能)【参考方案2】:

您可以尝试使用 Polyfill。以下 Polyfill 于 2019 年发布,对我有用。它将 Promise 函数分配给窗口对象。

用于:window.Promise https://www.npmjs.com/package/promise-polyfill

如果您想了解有关 Polyfill 的更多信息,请查看以下 MDN 网络文档 https://developer.mozilla.org/en-US/docs/Glossary/Polyfill

【讨论】:

这适用于添加承诺支持以赢得表单 WebBrowser 控件(当 Windows 使用 IE 11 作为其仿真版本时)。

以上是关于如何在 Internet Explorer 11 中支持 Promise?的主要内容,如果未能解决你的问题,请参考以下文章

如何使此 Google 字体在 Internet Explorer 11 上运行

如何阻止我的网页在 Internet Explorer 11 中打开?

如何使用 IE (Internet Explorer 11) 更改默认下载目录

如何仅使用 JavaScript 定位 Internet Explorer 11?

Internet Explorer 11 中的光标偏移

由于缓存控制标头,如何绕过 Internet Explorer 11 忽略我的字体?