如何在Internet Explorer 11中支持Promise?

85

我有一段简单的代码,在除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);
    }
  );

3
IE11不支持ES2015。 - Nina Scholz
10
IE11不支持箭头函数原生Promise。使用JS转译器(例如babel)或者不要使用ES6的特性。对于Promise的支持,你可以使用像bluebird这样的库。 - Tomalak
4
顺便提一下,注意 http://caniuse.com 显示此代码在除IE11外的其他浏览器中也无法运行。养成习惯,在那里查看您想要使用的 JS、CSS 或 HTML 功能的支持程度。 - Tomalak
相关内容:https://dev59.com/tV4c5IYBdhLWcg3wgqn2 - Benjamin Gruenbaum
2
如果您正在使用Babeljs转译代码,您可以安装“es2015-ie”预设以及“babel-polyfill”npm模块来解决IE的兼容性问题,同时避免一系列其他与IE相关的问题。 - Ilia Talalai
2个回答

114

如果你想让这种类型的代码在不支持ES6的IE11中运行,那么你需要获取第三方的promise库(例如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>

4
我猜 jQuery.Deferred 也可以使用,它应该从 IE6+ 开始支持。为什么选择 jQuery Deferred 呢?因为 jQuery 是非常流行和有用的库,大多数包含 JavaScript 的大型项目都会使用 jQuery 或其它库。因此,你不需要在项目中添加另一个依赖项,这会让你的团队领导或项目经理更加满意。 - Shreyan Mehta
@ShreyanMehta - 是的,jQuery承诺(使用其非标准实现)可以代替ES6承诺语法,但OP似乎在询问是否可以使用new Promise(),而这不是jQuery支持的语法。同样的情况也适用于其他承诺库,如Q,它们与旧版浏览器兼容,但具有自己的非标准语法。 - jfriend00
是的,这是真的,我也同意你的答案,但我添加评论的原因是我个人不会添加像bluebird这样的库,虽然它确实非常好,但在我的经验中,我没有看到很多人会喜欢它胜过jQuery。虽然这只是一个观点,也是社区的另一种解决方案。 - Shreyan Mehta
2
@ShreyanMehta 我不会仅因为HTTP请求而包含jQuery。这是一种负担很大的做法,当使用像Bluebird或Axios这样更小、更专注的库会更好时。除非项目已经在所有地方都使用了jQuery,否则我认为任何人都不应该优先选择jQuery而不是其他库。 - elliottregan
2
@elliottregan 好的,这对我来说是一次很好的学习。感谢您的反馈。 - Shreyan Mehta
2
letconst在IE11中可用,但不能在for循环中使用。这是IE11实际支持的仅有的ES6功能之一(还有有限的MapSet以及其他一些杂项功能)。 - Félix Brunet

7

1
这个方法适用于为Win Forms WebBrowser控件添加Promise支持(当Windows使用IE 11作为仿真版本时)。 - clamchoda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接