【发布时间】:2013-10-05 16:07:57
【问题描述】:
我有一个功能齐全的主干 js 应用程序。在我的控制器中,我通过链接的 when.apply 函数调用从 api 检索我的模型。例如,
$.when.apply($, [<<array of deferred async calls>>]).done(function () {
<<Code to be executed after all deferred calls complete>>
});
此代码已在最新的 firefox、chrome 和 IE10 浏览器中运行,但在 IE9 中不可用。 IE9 没有抛出任何错误,但我没有看到在网络选项卡中加载模型数据的调用。因此,调用完成后要执行的代码也不会被命中。
在搜索这个问题时,我遇到了这篇文章。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply 帖子说,
注意:大多数浏览器,包括 Chrome 14 和 Internet Explorer 9,仍然不接受类似数组的对象,并且会抛出异常。
有没有办法解决这个问题而无需大修我现有的代码,这很多?
编辑:在下面@Beetroot 的评论之后,似乎骨干的获取是罪魁祸首,它在 when.apply 中使用。
r = { method: 'get', body: { userId: loggedInUser } };
$.when.apply($, [employee.fetch(r), department.fetch(r)]).done(function () {
<<Code to be executed after all deferred calls complete>>
});
同样,在研究这个问题时,SO 中有类似Backbone fetch() fails for IE 的帖子,建议更改 fetch 函数以使其在 IE9 中工作。如上所述,我们的应用程序目前有数百个提取,如果我必须重写这些提取,这将使我们大大退缩。有没有其他方法可以解决这个问题?
【问题讨论】:
-
展示您如何创建和使用 数组。
-
您发布的代码看起来不错。几乎可以肯定,该错误存在于(或源自)一个或多个异步进程,其承诺位于传递给
.when()的数组中。 -
嗯@Beetroot-Beetroot,也许你有道理。在 when.apply 中,我传递了主干集合的 fetch 调用。例如,
[Employee.fetch(r), Department.fetch(r)]其中 r 有参数来表示它是否是带有附加参数的 get 调用。 -
我刚刚重新阅读了这个问题,并注意到“类似数组”的附带条件。您需要检查的第一件事是传递给
.when()的对象确实是一个数组。你可以使用jQuery的.makeArray(...)来确保它确实是一个数组。 -
是的 - 存在检查以确保在执行代码之前。同样,根据您的评论,我编辑了我的帖子以表明主干的 .fetch 调用是问题的根源。
标签: jquery backbone.js internet-explorer-9 fetch jquery-deferred