Angular和IE9愚蠢的原生方法

时间:2014-03-05 22:02:44

标签: angularjs internet-explorer-9 q

在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的承诺时有类似的问题?有谁知道这个愚蠢的评论具体指的是什么?

1 个答案:

答案 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。