Modernizr load [A,B]似乎在A之前执行B,这怎么可能?

时间:2013-02-09 11:27:18

标签: javascript angularjs modernizr yepnope

Modernizr。load({both:[a,b]})似乎在b之前执行a,但这不是Modernizr应该如何工作的? "yepnope.js [used by Modernizr] always executes things in the order they are listed"

Modernizr版本2.5.3和2.6.2。

我正在加载angular.jsangular-sanitize.js,如下所示:

Modernizr.load({
  both: [
    cdnDir + 'angular.js',
    cdnDir + 'angular-sanitize.js',
    d.i.assetsUrlPathStart + 'debiki-dashbar.js'],
  complete: bootstrapAngular
})

但是,angular-sanitize.js很少会因为angular尚未存在而死亡。

但是Modernizr.load(both: [a, b, c])是不是保证按顺序执行a,b,c?发生了什么......?

详细说明:

错误发生在angular-sanitize.jsangular.extend(...)行,这是摘录中的最后一行:(第148行)

// Elements that you can, intentionally, leave open (and which close themselves)
// http://dev.w3.org/html5/spec/Overview.html#optional-tags
var optionalEndTagBlockElements = makeMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),
    optionalEndTagInlineElements = makeMap("rp,rt"),
    optionalEndTagElements = angular.extend({}, optionalEndTagInlineElements, optionalEndTagBlockElements);

以下是错误消息:

  

未捕获的TypeError:无法调用未定义的方法'extend'   ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular-sanitize.js:148

并且Chrome的调试器显示window.angular确实未定义 - 虽然它在angular.js的最后一行使用(应该首先执行)。

Chrome(版本24.0.1312.57)表示angular.js和angualar-sanitize.js都是从​​浏览器的缓存中加载的。


更新:我认为这个更明确的重写确实应该有效。但是当它运行时,它有时打印出“Angular absent”并且稍后会消失(当angular-sanitize.js运行时) - 尽管Angular“必须”刚刚创建。

Modernizr.load({
  load: cdnDir + 'angular.js', // <-- creates `angular`
  complete: function(){
    if (typeof angular == 'undefined' || angular === null) {
      console.log('Angular absent.');  // <-- printed sometimes, and everything fails
    }
    Modernizr.load({
      load: cdnDir + 'angular-sanitize.js',
      complete: ...
      }
    });
  }
});

有人将此问题标记为重复:Can modernizr load scripts asychronously but execute them in order? - 但是,如果您仔细阅读此问题,您会发现此问题本身已经包含 回答到另一个问题(即:“[...]总是按照列出的顺序执行事情” - 这是另一个问题的答案)。相反,根据文档,这个问题是关于为什么事情以他们应该的方式工作的原因。

0 个答案:

没有答案