5

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

有没有办法让我确保在调用回调函数之前完全加载所有 require() 调用及其所有子 require() 调用?

有没有办法指定 require() 调用是同步的?

function someFunction(callback) {

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

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

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

  });

  callback();
};
4

2 回答 2

3

您需要callback在最后一个require(...)函数中执行:

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);
}
于 2013-01-23T19:24:52.147 回答
2

有一种方法可以使require通话同步。使其成为 CommonJS 风格:

var module = require('modulepath')

因此,如果您在嵌套的 require 调用中不需要工厂功能,则可以通过这种方式“同步” require 调用......但是既然这样做了,那么您就不走运了

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

您的问题的答案也很大程度上取决于嵌套 A 和嵌套 B 消耗的内容。如果它们依赖于 top 中的某些产品,那么您绝对必须使用“线程信号量”,并且不能将嵌套的 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) 视为“线程”,并将您对使用线程的理解应用于它。

于 2013-01-24T18:01:07.773 回答