在需要其他模块之前等待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'); });