使用TaskTimer每n秒调用一次函数

时间:2019-04-17 13:57:17

标签: typescript timer

我对在Typescript中使用类有疑问:

如果我运行此代码(不带类)

var timer = new TaskTimer(1000);

function getData() {
    return Date.now();
}

function print1() {
    console.log(getData());
}

timer.add({
    id: 'job1',
    tickInterval: 2,
    totalRuns: 0,
    callback() {
        print1();
    }
});

// Start the timer
timer.start();

它完美地工作!但是,如果我尝试只使用类来运行相同的代码,则会抛出错误:

error TS2339: Property 'print1' does not exist on type 'TaskCallback | ITaskOptions | Task | (TaskCallback | ITaskOptions | Task)[]'.
Property 'print1' does not exist on type 'TaskCallback'.

这是代码:

class App {

    timer: TaskTimer;

    constructor() {
        this.timer = new TaskTimer(1000);
    }

    getData() {
        return Date.now();
    }

    print1() {
        console.log(this.getData);
    }

    print2() {
        this.timer.add({
            id: 'job1',
            tickInterval: 1,
            totalRuns: 0,
            callback() {
                this.print1();
            }
        });

        this.timer.start();
    }
}

let app = new App();
app.print2();

第二种情况下我在做什么错?我可能会很累地想不出来,但现在我还是不明白...

1 个答案:

答案 0 :(得分:1)

使用object method shorthand定义回调,使其成为unbound function

            callback() {
                this.print1();
            }

换句话说,从callback内部开始,this不一定是类实例,而是任何调用上下文。

如果您将回调定义为绑定函数(fat arrow function),则this将保留为类实例:

            callback: () => {
                this.print1();
            }
            // Or shorthand:
            callback: () => this.print1()