停止等待 setTimeOut 函数

Ala*_*rte 0 javascript settimeout typescript

我有一个名为 delay() 的 Typescript 函数,它在异步/等待模式下调用。

play(){
   (async () => { 
       await this.delay(90000);
       this.player.play();
   })();
}

delay(ms: number) {
    return new Promise(resolve => setTimeout(resolve, ms));
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在完成 90 秒之前“杀死/中断”setTimeout 并在再次调用“播放”函数时再次开始计数?

Kou*_*sha 7

你可能想要类似的东西

const delay = (ms: number) => {
    let id;

    const promise = new Promise(resolve => {
        id = setTimeout(resolve, ms);
    });

    return {
        id, promise
    };
}

const play = () => {
    const { id, promise } = delay(1000);
    promise.then(() => console.log("Promise called"));
    // Or call this to cancel
    clearTimeout(id);
};
Run Code Online (Sandbox Code Playgroud)

但我会以另一种方式实现这一点:

const Timer = (ms: number) => {
    let id: number;

    const start = () => new Promise(resolve => {
        if (id === -1) {
            throw new Error('Timer already aborted');
        }

        id = setTimeout(resolve, ms);
    });

    const abort = () => {
        if (id !== -1 || id === undefined) {
            clearTimeout(id);
            id = -1;
        }
    }

    return {
        start, abort
    }
};

const timer = Timer(1000);
timer.start().then(() => console.log("done after 1000ms"));
timer.abort(); // this would abort the operation

// Calling timer.abort() before timer.start() would throw an error as well.
Run Code Online (Sandbox Code Playgroud)