在需要其他模块之前等待asynchronous操作

在我的main.js中,我正在asynchronous读取一个文件。 一旦我的文件被加载,我在GLOBAL命名空间中设置了一些对象,并在我的require模块中使用它们(使用GLOBAL命名空间是不是一个不同的故事,我正在使用它)。

我的require d模块立即希望该variables在加载时存在。 那么如何让我的文件读取在main.js中完成? 我只需要在readFile的callback模块? 或者有更好的方法来做到这一点?

例:

 fs.readFile('./file', function (data) { // do something GLOBAL.obj = data; }); require('./module.js'); 

module.js

 obj.someFunction(); 

你不喜欢这种解决scheme的直觉是可以理解的。 (你的胃是正确的)。 清理这件事的正确方法(你应该花时间 – 将来 – 你会感谢你的):

  • 通过你的十个模块中的每一个
  • 为每一个经历所有出口的function
  • 对于每一个函数,他们实际上依赖于什么样的全局variables。
  • 将这些参数添加到函数中。 如果他们现在需要大量的论证,可以考虑将它们分组成对象,创build有用的模型。

如果一堆函数都依赖于同一组variables,那么也可以考虑创build一个工厂函数

  • 创build一个函数,将以前的全局variables作为参数,并将所有模块的代码包装到该函数中。

  • 使该function成为您的模块的单一导出。 它充当工厂function并为该模块中的所有其他function创build上下文。 它应该返回之前导出的模块。

 // DB used to be a global module.exports = function(DB) { function getUser(user, cb) { DB.get('user', db); } return {getUser: getUser}; }; 

你可以像这样使用它:

 var module = require('module')(DB); module.getUser(myUser, function(){}}; 

是的,只要按照asynchronous编程规则#1。 依靠callback发生的东西必须在callback中执行。 由于您的require取决于async中设置的variables,因此您只能在其中使用您的require

 fs.readFile('./file', function (data) { // do something GLOBAL.obj = data; require('./module.js'); });