您的導出無法正常工作,因爲它在foo
聲明的內部時在功能之外。但是如果你把輸出放在裏面,當你使用你的模塊時,你不能確定輸出是被定義的。
使用ansync系統的最佳方式是使用回調。您需要導出回調分配方法以獲取回調,並在異步執行時調用它。
實施例:
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 code 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 code using foo;
});
無極方式
您還可以使用無極解決。這種方法支持多個呼叫由無極設計:
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 code using foo;
});
參見Promise documentation
一直在玩我的實際用例,並且nconf加載正常,如果nconf.file()被調用時不存在的文件,所以現在我不需要一個解決方案。但我仍然對這種方法感興趣。 – Brett
我有同樣的問題,我想導出一個承諾,並且'require'異步加載依賴。我認爲這是可能與巴貝格式化。但是,我不認爲這些解決方案很好。 :( –