您的导出无法工作,因为
foo声明在内部时,它在函数外部。但是,如果将导出文件放在其中,则在使用模块时,不能确保已定义导出文件。
使用异步系统的最佳方法是使用回调。您需要导出回调分配方法以获取回调,并在异步执行时调用它。
例:
var foo, callback;async.function(function(response) { foo = "foobar"; if( typeof callback == 'function' ){ callback(foo); }});module.exports = function(cb){ if(typeof foo != 'undefined'){ cb(foo); // If foo is already define, I don't wait. } else { callback = cb; }}这async.function
只是一个象征异步调用的占位符。
在主要
var fooMod = require('./foo.js');fooMod(function(foo){ //Here pre using foo;});多重回调方式
如果您的模块需要多次调用,则需要管理一个回调数组:
var foo, callbackList = [];async.function(function(response) { foo = "foobar"; // You can use all other form of array walk. for(var i = 0; i < callbackList.length; i++){ callbackList[i](foo) }});module.exports = function(cb){ if(typeof foo != 'undefined'){ cb(foo); // If foo is already define, I don't wait. } else { callback.push(cb); }}这async.function
只是一个象征异步调用的占位符。
在主要
var fooMod = require('./foo.js');fooMod(function(foo){ //Here pre using foo;});承诺方式
您也可以使用Promise解决此问题。此方法通过Promise的设计支持多次调用:
var foo, callback;module.exports = new Promise(function(resolve, reject){ async.function(function(response) { foo = "foobar" resolve(foo); });});这async.function
只是一个象征异步调用的占位符。
在主要
var fooMod = require('./foo.js').then(function(foo){ //Here pre using foo;});请参阅Promise文档



