gpt4 book ai didi

node.js - 异步 nodejs 模块导出

转载 作者:IT老高 更新时间:2023-10-28 21:51:31 28 4
gpt4 key购买 nike

我想知道配置模块导出的最佳方法是什么。下面示例中的“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 来解决这个问题。该方法通过 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 documentation

关于node.js - 异步 nodejs 模块导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20238829/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com