如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章