How to cancel timeout inside of Javascript Promise?

前端 未结 4 1676
迷失自我
迷失自我 2020-12-29 06:04

I\'m toying with promises in JavaScript and tried to promisify setTimeout function:

function timeout(ms) {
  return new Promise(function(resolve, reject) {
          


        
4条回答
  •  佛祖请我去吃肉
    2020-12-29 06:56

    This is my answer in TypeScript:

      private sleep(ms) {
        let timerId, endTimer;
        class TimedPromise extends Promise {
          isCanceled: boolean = false;
          cancel = () => {
            endTimer();
            clearTimeout(timerId);
            this.isCanceled = true;
          };
          constructor(fn) {
            super(fn);
          }
        }
        return new TimedPromise(resolve => {
          endTimer = resolve;
          timerId = setTimeout(endTimer, ms);
        });
      }
    

    Usage:

    const wait = sleep(10*1000);
    setTimeout(() => { wait.cancel() },5 * 1000);
    await wait; 
    

提交回复
热议问题