NodeJS setImmediate and private class method

Advertisements

So, first time experimenting with setImmediate. It seems it can’t run private class methods. Is that so? If yes, can someone explain to me why?

Doesn’t work

Private class method as argument to setImmediate. Throws Callback must be a function. Received undefined

class TestPrivate {
    public start(): void {
        setImmediate(this.looper);
    }

    async looper(): Promise<void> {
        console.log(`${new Date().toLocaleString()}`);
        await sleep(500);
        setImmediate(this.looper);
    }
}

const testPrivate: TestPrivate = new TestPrivate();
testPrivate.start();

This does work

Static class method as argument to setImmediate

class TestStatic {
    public start(): void {
        setImmediate(TestStatic.looper);
    }

    static async looper(): Promise<void> {
        console.log(`${new Date().toLocaleString()}`);
        await sleep(500);
        setImmediate(TestStatic.looper);
    }
}

const testStatic: TestStatic = new TestStatic();
testStatic.start();

>Solution :

If you pass this.looper, then the by the time the function is called, looper will no longer have a correct reference to this, so this breaks on the second iteration.

Solve this by using one of the following:

setImmediate(this.looper.bind(this));
setImmediate(() => this.looper);

Leave a ReplyCancel reply