变量不全局或文件系统readfile太慢

时间:2018-10-14 16:32:38

标签: javascript electron twitch twitch-api

我正在尝试使用Electron和tmi.js存储库制作一个Twitch Bot,我希望程序将数据(例如用户名,OAuth令牌等)保存在.json文件中。当我重新打开应用程序时,它会立即读取文件并创建具有所有设置的选项对象(适用于twitch API)。一切正常,但是tmi.js存储库中的client.on事件给我一个错误:“无法读取未定义的属性'on'”。

读取文件代码:

fs.readFile("connectionSettings.json", (err, data) => {
    if (err){
        console.log(err);
    } else {
        channelData = JSON.parse(data);
        options = {
            options: {
                debug: true
            },
            connection: {
                cluster: "aws",
                reconnect: true
            },
            identity: {
                username: channelData[1],
                password: channelData[2]
            },
            channels:[channelData[0]]
        };

        client = new tmi.client(options);
        client.connect();
    }
})

聊天事件中的客户端:

client.on("chat", function(channel, userstate, message, self) {
    mainWindow.webContents.send("message:add", userstate.username, message);
    console.log("message");
})

client变量在文件顶部用“ let client;”声明。

但是,如果我调用这样的函数:

function sendMessage(msg) {
    client.say(options.channels[0].replace("#",""), msg)
}

一切正常,因此我假设在底部聊天事件的客户端以某种方式早于读取.json文件并设置变量的方式调用。

有什么想法我可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您的代码存在问题,因为您使用的是fs.readFile,它本质上是异步的。这意味着脚本不会等待json读取操作完成,它将继续逐行执行。因此,在readFile之后,您的代码然后直接执行client.on事件。这是有关 asynchronous javascript

的有趣读物

解决方案是您要么处理代码的异步性质,要么使用readFileSync的同步版本readFiledocumentation)。