gpt4 book ai didi

node.js - 等待模块导入异步初始化的最佳方法?

转载 作者:行者123 更新时间:2023-12-05 07:37:32 29 4
gpt4 key购买 nike

TL;DR:有没有一种方法可以等待具有异步功能的模块导入完成,然后再继续在调用模块中执行,以保持包含模块功能?

我正在开发一个个人 Node 项目,随着代码库的不断增长,我一直在以模块化/OOP 方式构建该项目。一个要求是启用跨模块/对象的日志记录,其中可以在不同的时间记录不同的日志文件。我认为我已经通过创建一个带有 init 函数的 Logger.js 文件以一种非常干净的方式解决了这个问题,我可以通过简单地在我需要的任何模块中导入 Logger.js 文件来随时使用它。这是用于说明这一点的精简代码:

记录器.js

module.exports.init = function(location) {
var logFileBaseName = basePath + fullDatePathName;
var studentLogFile = fs.createWriteStream(logFileBaseName + '-student.log', {flags : 'a'});
var teacherLogFile = fs.createWriteStream(logFileBaseName + '-teacher.log', {flags : 'a'});

this.studentLog = function () {
arguments[0] = '[' + Utils.getFullDate() + '] ' + arguments[0].toString();
studentLogFile.write(util.format.apply(null, arguments) + '\n');
}
this.teacherBookLog = function () {
arguments[0] = '[' + Utils.getFullDate() + '] ' + arguments[0].toString();
teacherLogFile.write(util.format.apply(null, arguments) + '\n');
}
}

这看起来很棒,因为在我的主要入口点我可以简单地做:

主要.js

const Logger = require('./utils/Logger');

Logger.init(path);
Logger.studentLog('test from Main');

// all my other code and more logging here

在我的其他几十个文件中,我可以做的更少:

另一个文件.js

const Logger = require('./utils/Logger');

Logger.studentLog('test from AnotherFile')

然后要求不仅要记录到“学生日志”的文件,还要记录到 Discord(聊天客户端)。看起来很简单,我有这个 Logger 文件,我可以初始化 Discord 并在“学生日志”旁边登录到 Discord,如下所示:

记录器.js

module.exports.init = function(location) {

// code we've already seen above

var client = new Discord.Client();
client.login('my_login_string');
channels = client.channels;

this.studentLog = function () {
arguments[0] = '[' + Utils.getFullDate() + '] ' + arguments[0].toString();
var message = util.format.apply(null, arguments) + '\n';
studentLogFile.write(message);
channels.get('the_channel_to_log_to').send(message)
}

// more code we've already seen above
}

问题是,如果您再次重新运行 Main.js,studentLog 将失败,因为 .login() 函数是异步的,它返回一个 Promise。登录尚未完成,当我们尝试调用 Logger.studentLog('test from Main');

时, channel 将是一个空集合

我已经尝试在 Logger.js 中使用 Promise,但是在 Logger.js 中返回 promise 之前,Main.js 的执行当然会继续。如果 Main.js 可以简单地等到 Discord 登录完成,我会很高兴。

我的问题是,在保持我一直使用的模式的同时完成这项工作的最佳方法是什么?我知道我可以将我的整个主要功能包装在一个 promise.then() 中,等待 Discord 登录完成,但这对我来说似乎有点荒谬。我试图将功能包含在模块中,不希望这种记录器代码/逻辑溢出到我的其他模块中。我想像我一直做的那样将它保留为简单的 Logger 导入。

任何建议都会很棒!!

最佳答案

如果等待某个异步函数的结果,然后在同一个调用函数中使用,则首先解析结果,然后再使用。如果结果在另一个函数或模块中使用(例如,将结果分配给全局变量),则不会解析。在您的情况下,如果 client.login() 异步地为 client.channels 赋值,则该赋值等待,并且 channels = client.channels 分配会将 undefined 分配给 channels

要解决此问题,您必须使用回调或从 client.login() 返回 promise ,如评论中所述。

可以引用this文章。

关于node.js - 等待模块导入异步初始化的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48529362/

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