RequireJS: 嵌套的 require 调用

5

我有一个场景,其中我有嵌套的require()调用来加载不同的模块。

是否有一种方法可以确保在回调函数被调用之前,所有的require()调用及其子require()调用都已完全加载?

是否有一种指定require()调用为同步的方法?

function someFunction(callback) {

  //top level require
  require([...], function(...) {

     //nested require
     require([...], function(...) {
     });

     //nested require
     require([...], function(...) {
     });

  });

  callback();
};

你不应该使用依赖吗? - epascarello
1
是的。但我们正在尝试将我们的内容分成单独的文件。例如,上面的代码在FileA.js中。FileB.js使用其回调函数调用someFunction()。然而,它的回调函数依赖于在FileA.js的require()回调中发生的一些设置。问题在于,require的异步性意味着回调在其require()中的依赖项设置之前执行。 - glui2001
2个回答

3
你需要在最后一个 require(...) 函数中执行 callback
function someFunction(callback) {
   require(['somemodule'], function(someModule) {
     // do stuff with someModule...

     // execute callback
     callback(); 
   });
}

你还可以使用define函数来指定依赖项
示例:
define('somemodule', ['somedependency'], function(someDependency) {
   // return somemodule
   return {
     someProperty: someDependency.getProperty();
   };
});

function someFunction(callBack) {
   var someModule = require('somemodule');   
   var foo = someModule.someProperty;

   return callBack(foo);
}

2
有一种方法可以使require同步调用。将其设置为CommonJS风格:
var module = require('modulepath')

所以,如果你不需要在嵌套的require调用中使用工厂函数,你可以通过这种方式“同步”require调用...但是由于你需要,所以你没有办法。

AMD风格的require(depsArray, factoryFn)就像将你的代码推入一个并行线程一样。没有办法使它“同步”,但是你可以使用“信号量”来协调结果。

对你的问题的答案也极大地取决于嵌套的A和B消耗了什么。如果它们依赖于顶部require的某些产品,那么你绝对必须使用“线程信号量”,而不能仅将嵌套的require调用推入命名定义调用中:

function someFunction(callback) {

  var resultOfOuterCode = someResultOfCalculations

  //top level require
  require([...], function(...) {

    var resultOfTopRequireCode = someOtherResultOfCalculations

    var semaphore = {
      'count': 2 // represents the number of thread that need to be "done" before 
      , 'callback':callback // this callback is fired.
      , 'checkIfLast': function(){
        this.count -= 1
        if (!this.count) {
          // count is now 0 - time to run our callback
          this.callback()
        }
      }
    }

    //nested require A
    require([...], function(...) {
      // using resultOfTopRequireCode // <-- !!!! this is important part
      ...
      semaphore.checkIfLast()
    });

    //nested require B
    require([...], function(...) {
      // using resultOfTopRequireCode // <-- !!!! this is important part
      semaphore.checkIfLast()
    });

  });

};

换句话说,只需将require(dependsArray,factoryFn)视为“线程”,并将您使用线程的理解应用于它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接