使用Promise.all()在Backbone中解决IE 11兼容性问题

10

背景: 我被委派帮助解决以下错误问题:

'Promise' is undefined'

这是我们sessionsmodel.js脚本的一部分:

return Promise.all(promises);

promises是一个包含需要执行的动作的数组,如果任何一个动作失败了,它就会被拒绝。

问题:根据我的研究,IE不支持Promise,那么是否有一种解决方法可以应用到这个返回值中,以达到相同的效果?


1
没错,有一个解决办法 - 换个浏览器!IE已经死了。它将不再获得任何更新。 - Endless
1
在谷歌上搜索一些“Promise Polyfill”。 - Endless
2
很不幸,最终客户可能不会接受那个答案,但我同意你的看法。哈哈。 - Denoteone
1
请将代码改写为使用常规回调函数。 - adeneo
1
ES6 Promise规范被像Q、When、RSVP、Bluebird、Lie等“好”的库所实现... 您可以使用其中之一... - sidanmor
显示剩余3条评论
3个回答

7

由于您正在使用Backbone,所以承诺可能是jQuery承诺。您可以使用jQuery的.when函数来执行与Promise.all相同的操作:

return $.when.apply($, promises);

对于大多数其他简单情况,您可以通过使用提供的回调函数完全避免使用 promises 来调用诸如 savefetch 等函数:

model.save({
    context: this,
    success: this.onModelSuccess
});

不需要使用另一个库,因为Backbone已经默认使用了jQuery,除非您不喜欢jQuery deferred或者您正在使用其他替代jQuery的东西。


对于仍在支持IE11并且使用jQuery < 3的人,请注意,如果promises包含本地Promise而不是$.Deferred对象,则它们将不会被解封,请参见此答案 - OfirD

1

ES6 Promise规范已被“好”的库(如Q, When, RSVP, Bluebird, Lie等)实现。

如果您想了解更多关于Promises的信息,请查看此链接:Promises


1

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