typescript - 这在使用装饰器调用异步函数时

标签 typescript

我有一个名为 commands.js 的文件。在我的概念中,它会在调用实际函数之前被调用,并且会检查 message 是否有 contentcontent 是否等于(或开始像) 命令。在我使函数异步之前一切正常。我用装饰器转换了文件(根据 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\`!`);
}

最佳答案

将描述符更改为经典函数,然后您可以直接从this 访问作用域。此外,如果将 descriptor.value 更改为异步函数,则可以直接在装饰器中使用 await。 https://stackblitz.com/edit/typescript-dycwcg

descriptor.value = async function(msg: Message) {
  await f.apply(this, msg);
}

关于typescript - 这在使用装饰器调用异步函数时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42988599/

相关文章:

angular - 在 ng2-charts 中隐藏未使用的轴

javascript - 变量在分配之前使用(TypeScript)

typescript - 省略类型往返不适用于泛型

javascript - 有人可以解释一下这个http状态代码是如何处理的吗?

node.js - NestJS - Mongoose @InjectConnection 单元测试

java - 如何将 json 对象从 Angular 发送到 Rest 服务?

javascript - 键入用于将值添加到数组的通用函数,该数组是对象的属性

javascript - 使用新 Set 删除数组中的重复项会出错

typescript - 如何使用角度中的日期管道格式化日期数组?

javascript - 必须刷新页面才能从 api 获取数据