异步nodejs模块导出

我想知道配置模块导出的最佳方法是什么。在下面的示例中,“ async.function”可以是FS或HTTP请求,为示例起见简化了该请求:

这是示例代码(asynmodule.js):

var foo = "bar"

async.function(function(response) {

foo = "foobar";

// module.exports = foo; // having the export here breaks the app: foo is always undefined.

});

// having the export here results in working code, but without the variable being set.

module.exports = foo;

如何仅在执行异步回调后导出模块?

编辑

有关我的实际用例的简短说明:我正在编写一个模块,用于在fs.exists()回调中配置nconf(https://github.com/flatiron/nconf)(即它将解析配置文件并设置nconf)。

回答:

您的导出无法工作,因为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 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;

});

承诺方式

您也可以使用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 code using foo;

});

请参阅Promise文档

以上是 异步nodejs模块导出 的全部内容, 来源链接: utcz.com/qa/419818.html

回到顶部