我有一个名为commands.js
的文件。在我的概念中,它将在调用实际函数之前调用,并且如果message
具有content
且content
等于(或类似于cmd
,则会进行检查。在我的函数异步之前,一切都还可以。我用装饰器转换了文件(根据tsc
的提示),结果如下:
import { Message } from "discord.js";
export function command(cmd:string, eq:boolean=false) {
return (target, propertyKey: string, descriptor: TypedPropertyDescriptor<(msg: Message) => Promise<void>>) => {
let f = descriptor.value;
descriptor.value = (msg: Message) => {
if(!msg.content || msg.content.trim() === "") {
return Promise.resolve<void>(undefined);
}
if(!msg.author) {
return Promise.resolve<void>(undefined);
}
if(eq && msg.content !== cmd) {
return Promise.resolve<void>(undefined);
} else if(!eq && !msg.content.startsWith(cmd + " ") && msg.content !== cmd) {
return Promise.resolve<void>(undefined);
}
if(f) {
return f.call(f.caller, msg);
} else {
return Promise.resolve<void>(undefined);
}
};
return descriptor;
};
};
它有效,但在实际功能(f
)this
中没有持续存在,因此无法从中获取任何信息。
我做错了什么以及如何让this
回到我的异步功能中?
@command("!ping", true)
async onMessage(msg:Message) {
msg.react("");
let startDate = Date.now();
msg = await msg.channel.sendMessage(":information_source: Pong!");
let diff = Date.now() - startDate;
// THAT'S THE POINT WHERE IT CRASHES
this.log("info", `Ping for sendMessage in Channel#${msg.channel.id}: ${diff}ms`);
msg.edit(`:information_source: Pong - \`${diff}ms\`!`);
}
答案 0 :(得分:0)
将描述符更改为经典函数,然后可以直接从this
访问范围。同样,如果将描述符。值更改为异步函数,则可以直接在装饰器中使用await。 https://stackblitz.com/edit/typescript-dycwcg
descriptor.value = async function(msg: Message) {
await f.apply(this, msg);
}