javascript - 是否可以创建一个 require.js 模块来决定何时完成加载?

标签 javascript requirejs

在“正常”的 require.js 函数模块中,模块函数一返回就认为该模块已“加载”:

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

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

当为 require.js 创建加载器插件时,您会获得一个“onload”函数,您可以在插件完成加载时调用该函数。这对我来说是完美的,但我不希望我的 Google API 包装器成为一个插件,我希望它看起来像一个“普通”模块。优化器对插件的处理方式不同,我不想让你头疼。此外,插件必须使用特殊语法,我希望避免每次使用时都记住这一点。

我梳理了API好几次都没有找到方法来完成我想做的事情。是否有一种未记录(或记录不完整)的模块定义方法,模块本身可以决定何时应将其视为“已加载”?


例如,如果存在这样的实现,那就太棒了:

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

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

最佳答案

我们使用以下基于 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);
};

关于javascript - 是否可以创建一个 require.js 模块来决定何时完成加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28607296/

相关文章:

javascript - jquery如何获取div下面的第N个元素

javascript - 如何在服务之间进行双向通信?

javascript - Require.js 嵌套要求

javascript - 使用 RequireJS 时如何从 CDN 加载第三方 JavaScript?

javascript - Require.js 优化器和路径中的变量

JavaScript : Jump to method definition using eclipse

带有事件参数的 Javascript setTimeout 函数调用?

asp.net 中的 Javascript 与单选按钮列表

javascript - RequireJS 文本插件和变量连接字符串

javascript - 多文件 JavaScript 库