Discord 强制异步函数等待模块加载其属性

Discord 强制异步函数等待模块加载其属性,discord,discord.js,Discord,Discord.js,对于我的discord bot,我想让我的bot在查询mongo前缀之前检查它是否缓存了服务器的前缀。问题是异步函数在尝试读取缓存之前不会等待缓存初始化 const common = require('../util/common'); const Discord = require('discord.js'); const math = require('mathjs'); const guildSettings = require('../schema/guildSchema'); mod

对于我的discord bot,我想让我的bot在查询mongo前缀之前检查它是否缓存了服务器的前缀。问题是异步函数在尝试读取缓存之前不会等待缓存初始化

const common = require('../util/common');
const Discord = require('discord.js');
const math = require('mathjs');
const guildSettings = require('../schema/guildSchema');

module.exports = {
    name: "test2",
    description: "a test command!",
    usage: `\`${process.env.PREFIX}test2\``,
    category: "Admin",
    alias: ["test2"],
    disabled: false,
    cache: {},
    async execute(message, args){ 
        
        let prefix = await getPrefix();
        console.log(this.cache);
        message.reply(` your prefix is ${prefix}`);

        async function getPrefix(){
            if (!this.cache[message.guild.id]){
                let settings = await guildSettings.findOne({ _id: message.guild.id });
                if (!settings){
                    settings = await guildSettings.create({
                        _id: message.guild.id,
                        prefix: '-',
                    });
                    await settings.save();
                    console.log('entry created')
                }
                this.cache[message.guild.id] = settings.prefix;
                console.log('prefix cached');
                return prefix = this.cache[message.guild.id];
            } else {
                return prefix = this.cache[message.guild.id];
            }
        }
    }
}

忽略
console.log()。当我调用这个命令时,我得到一个错误,因为
this.cache
未定义。如何使函数等待父属性初始化?

问题出在这个块中

async function getPrefix(){
            if (!this.cache[message.guild.id]){ // here this doesn't refer to parent but the function itself
                let settings = await guildSettings.findOne({ _id: message.guild.id });
                if (!settings){
                    settings = await guildSettings.create({
                        _id: message.guild.id,
                        prefix: '-',
                    });
                    await settings.save();
                    console.log('entry created')
                }
                this.cache[message.guild.id] = settings.prefix;
                console.log('prefix cached');
                return prefix = this.cache[message.guild.id];
            } else {
                return prefix = this.cache[message.guild.id];
            }
        }
这里您使用的是函数关键字。这意味着,每当您在该函数中访问此时,它将引用该函数本身,而不是父函数

解决方法是首先将父变量的这个值存储在另一个变量中

 async execute(message, args){ 
        const self = this; // this is new , no pun intended
        let prefix = await getPrefix();
        console.log(self.cache);
        message.reply(` your prefix is ${prefix}`);

        async function getPrefix(){
            if (!self.cache[message.guild.id]){
                let settings = await guildSettings.findOne({ _id: message.guild.id });
                if (!settings){
                    settings = await guildSettings.create({
                        _id: message.guild.id,
                        prefix: '-',
                    });
                    await settings.save();
                    console.log('entry created')
                }
                self.cache[message.guild.id] = settings.prefix;
                console.log('prefix cached');
                return prefix = self.cache[message.guild.id];
            } else {
                return prefix = self.cache[message.guild.id];
            }
        }
    }


嗯,事情总是这么简单,是吗?谢谢!总是男人。我失眠的原因