在nodejs/sqlite3中,run的第一个回调参数返回类实例,我该如何修复它?

问题描述 投票:0回答:1

我在 TypeScript 中有以下类:

class Log
{
    public id: number;
    public text: string;

    construct(text: string){
        this.text = text;
    }

    save(){
        db.run(
            `insert into logs(text) values (?) `,
            this.text,
            ((this: RunResult, err: Error | null) => {
                if(err){
                    //...
                }
                console.log(this);//expecting RunResult{} but Log{}
            })
        )
    }
}

我想通过在回调函数块中使用

RunResult.lastID
来更新日志实例的 id,并且
@types/sqlite3/index.d.ts
包含此声明:

    run(params: any, callback?: (this: RunResult, err: Error | null) => void): this;

但是回调参数中的

this
是Log类型而不是RunResult类型。

如何获得正确的 RunResult 实例?

this.lastID
期待一个值而不是
undefined

javascript node.js typescript sqlite electron
1个回答
0
投票

this
函数参数中的
run
关键字不是要传递的参数,而是函数上下文。此外,箭头函数没有上下文,因此回调中的
this
关键字确实引用了
Log
类。

因此,首先,您必须在回调之外保留

Log
类上下文,并使用普通函数而不是箭头函数作为回调。

这是修改后的

save
功能:

save() {
    const instance = this;
    db.run(
        `insert into lorem(info) values (?) `,
        this.text,
        function (err: Error | null) {
        if (err) {
            console.log(err);
        }
        instance.id = this.lastID;
        console.log(this);
        }
    );
}
© www.soinside.com 2019 - 2024. All rights reserved.