requirejs竞争条件 - 如何阻止直到检索到上一个文件

时间:2014-02-02 02:20:36

标签: javascript requirejs race-condition

common_tempaltes文件不是requirejs文件 - 而是定义全局变量的文件。

common_templates需要hogan。他们或多或少同时被要求,但竞争条件正在受到影响。 common_templates有时会赢,所以代码会因“hogan尚未加载”而失败。

require(['module1', 'hogan', 'common_templates'], function(Module){
    Module.do_stuff() // this module also requires hogan and common_templates to be loaded
});

除了嵌套的需求之外,是否有内置的方法告诉需要在完全下载hogan之前阻止?

嵌套:

require(['hogan'], function(Fn, Ui){
    require(['common_templates'], function(){
        require(['module1'], function(Module){
            Module.do_stuff();
        });
    });
});

这种方法看起来有点笨拙。是否有内置的方法来解决这些竞争条件?

3 个答案:

答案 0 :(得分:4)

如果common_templates不是AMD模块(不包含define([deps])调用),那么您需要将其配置为垫片:

require.config({
  shims: {
     common_templates: {
      deps: ["hogan"]
     }
  } 
});

现在,require(['module1', 'hogan', 'common_templates'])require(['module1', 'common_templates'])应该有效。

答案 1 :(得分:0)

我有同样的问题。 我需要基本上“阻止”我的程序流,以确保在第二个依赖项列表之前加载了一个初始的依赖项列表,最后是我的主应用程序代码。 这就是我解决的问题它即可。这是我在index.html文件中进行的Require.js调用:

np.array([[set(bi).issubset(set(ai))] for ai, bi in zip(map(tuple, a), map(tuple, b))])

<script src="/js/lib/require_2.1.22.js"></script> <script> //debugger; //Load common code that includes config, then load the app //logic for this page. Do the requirejs calls here instead of //a separate file so after a build there are only 2 HTTP //requests instead of three. requirejs(['/js/common_libs.js'], function (common) { //debugger; //Ensure the the AdminLTE code and its dependencies get loaded prior to loading the Backbone App. requirejs(['/js/lib/adminlte.js'], function (common) { //debugger; //The main file for the Backbone.js application. requirejs(['/js/app/main_app.js']); }); }); </script> 文件包含common_libs.js内容。 requirejs.config({shim:...})库执行它自己的依赖项检查,如果它没有检测到它的依赖项,它会在控制台上抱怨。我的问题是它与其依赖项异步加载并导致竞争条件

我能够将adminlte.js中的现有代码包装成这样:

adminlte.js

这允许我单独加载这个库及其依赖项。 //My experiments with Require.js to prevent race conditions. define([ 'jQuery-2.1.4.min', 'bootstrap.3.3.6', 'jquery.slimscroll.min' ], function($, Bootstrap, SlimScroll ) { //Existing code goes here ... //I knew to return this value by looking at the AdminLTE code. Your mileage may vary. return $.AdminLTE; }); 中的代码仅在加载依赖项后执行。然后,只有在完成后,才会加载adminlte.js及其依赖项。

以这种方式构建代码允许您批量显式加载依赖项。

为清晰起见进行编辑:

依赖项分阶段加载。澄清上面的例子:

在第一阶段加载jQuery,Boostrap和SlimScroll库,然后执行main_app.js文件。

在第二阶段,加载所有其他依赖项,然后执行adminlte.js文件。 main_app.js将有自己定义的([],...)函数,该函数调出需要加载的其余依赖项。

这比为每个依赖项编写嵌套的require()调用要高效得多。而且,就我在requirejs.org网站上所知,这是加载串行依赖的“正确”方法。

编码更新: 我还必须将main_app.js库中的代码包装在define()语句中,以便显式调用此库依赖于jQuery。否则它会在竞争条件下设置另一个机会。

答案 2 :(得分:-1)

这没有意义,你说“common_templates需要hogan”,但如果common_templates需要hogan,那么hogan代码启动后就会加载common_templates。< / p>

确保common_templates.js的定义如下:

define(['hogan'], function(){
    //common_templates suff here
});