是否可以创建一个require.js模块,在加载完成后自行决定?

时间:2015-02-19 13:10:22

标签: javascript requirejs

在“普通”require.js功能模块中,模块函数返回后,模块被视为“已加载”:

define(function() {
    // As soon as this function returns, the module is "loaded"
});

但我有一个模块需要进行一些异步脚本加载(特别是包括一些Google Javascript API),我不希望我的模块被认为是“加载”,直到我说它为止。

为require.js创建一个加载程序插件时,会为您提供一个“onload”函数,您可以在插件加载完成后调用该函数。这对我的情况来说是完美的,但我不希望我的Google API包装器成为插件,我希望它看起来像是一个“普通”模块。优化器对插件的处理方式不同,我不想让这个头疼。还必须使用特殊语法来插件,并且我希望每次使用时都要记住它。

我已经多次梳理API而没有找到办法完成我想要做的事情。是否存在未记录(或记录不良)的定义模块的方法,模块本身可以决定何时应该将其视为“已加载”?


作为一个例子,如果它存在的话,这样的实现将是非常棒的:

define(["onload"], function(onload) {
    setTimeout(onload, 5000);
});

第一次需要此模块时,“加载”需要5秒钟。

1 个答案:

答案 0 :(得分:0)

我们使用下面的约定来引导很多东西,该约定基于MEAN堆栈的早期版本(0.3.x)并使用了令人敬畏的async库。

使用您的示例,它可能如下所示:

// bootstrap.js

// Array of tasks to pass to async to execute.
var tasks = [];

// Require path
var thePath = __dirname + '/directoryContainingRequires';

// Build array of tasks to be executed in parallel.
fs.readdirSync(thePath).forEach(function (file) {
  if (~file.indexOf('.js')) {
    var filePath = thePath + '/' + file;

    tasks.push(function(callback) {
      require(filePath)(callback);
    });
  }
});

// Execute parallel methods.
async.parallel(
  tasks, 
  function(err) {
      if(err) console.error(err);
      console.log('All modules loaded!');
      process.exit(0);
  }
);

所需文件类似于:

// yourModule.js
module.exports = function(moduleCallback) {
  setTimeout(function() {
     console.log('5 seconds elapsed');
     moduleCallback(null);
  }, 5000);
};