在Angular 1.2.0中,有一个有趣的评论:
// IE愚蠢! (IE没有申请某些原生功能)
它位于functionCall函数的第9835行:
functionCall: function(fn, contextGetter) {
var argsFn = [];
if (this.peekToken().text !== ')') {
do {
argsFn.push(this.expression());
} while (this.expect(','));
}
this.consume(')');
var parser = this;
return function(scope, locals) {
var args = [];
var context = contextGetter ? contextGetter(scope, locals) : scope;
for (var i = 0; i < argsFn.length; i++) {
args.push(argsFn[i](scope, locals));
}
var fnPtr = fn(scope, locals, context) || noop;
ensureSafeObject(context, parser.text);
ensureSafeObject(fnPtr, parser.text);
// IE stupidity! (IE doesn't have apply for some native functions)
var v = fnPtr.apply
? fnPtr.apply(context, args)
: fnPtr(args[0], args[1], args[2], args[3], args[4]);
return ensureSafeObject(v, parser.text);
};
},
我认为这会让我感到痛苦,但不会引发任何错误,因此我很难看到它可能正在尝试(并且失败)调用apply的 本机功能。自从我实现了$ q库以使用promises来处理异步REST调用之后,IE9甚至没有尝试调用服务(根据开发工具中的网络选项卡)。相反,承诺立即被拒绝。我试着谷歌搜索答案,然后看着棱角分明的docs on using IE,但我无处可去。
有没有人在使用angular的“q-lite”获得使用IE9的承诺时有类似的问题?有谁知道这个愚蠢的评论具体指的是什么?
答案 0 :(得分:1)
我相信我通过大量的反复试验弄明白了。在我看来,问题似乎是我使用内置的q
库进行承诺......特别是q.all([])
:
$q.all([
firstRequest.$promise,
secondRequest.$promise,
thirdRequest.$promise,
moreRequets.$promise
]).then(function() {
//do stuff
});
虽然我仍然没有找到角度代码在some native functions
时引用的具体操作,但我发现docs for function.apply()有以下警告:
注意:大多数浏览器(包括Chrome 14和Internet Explorer 9)仍然不接受类似数组的对象,并会抛出异常。
无论具体细节如何,删除我对$q.all
的引用都会为我解决。我希望这有助于将来遇到此问题的任何人。如果有人碰巧遇到另一种情况,这种IE行为会使角色变得尖锐,也许他们会非常友好地在下面发表评论或添加答案。
仅供参考,我目前处于角度1.2.14。