Как проверить, ожидает ли обещание

У меня есть такая ситуация, в которой я хотел бы знать, какой статус имеет обещание. Ниже функция start вызывает только someTest, если она больше не работает (обещание не ожидается). Функция start может быть вызвана много раз, но если ее вызывать, пока тесты все еще работают, она не будет ждать и возвращает только false

class RunTest {
    start() {
         retVal = false;

         if (!this.promise) {
             this.promise = this.someTest();
             retVal = true;                
         }

         if ( /* if promise is resolved/rejected or not pending */ ) {
             this.promise = this.someTest();
             retVal = true;
         }

         return retVal;
    }

    someTest() {
        return new Promise((resolve, reject) => {
            // some tests go inhere
        });
    }
}

Я не могу найти способ просто проверить статус обещания. Что-то вроде this.promise.isPending было бы хорошо:) Любая помощь была бы оценена!

Ответы

Ответ 1

Вы можете подключить обработчик then, который устанавливает флаг done в обещании (или в случае RunTest, если вы предпочитаете), и проверьте, что:

     if (!this.promise) {
         this.promise = this.someTest();
         this.promise.catch(() => {}).then(() => { this.promise.done = true; });
         retVal = true;                
     }

     if ( this.promise.done ) {
         this.promise = this.someTest();
         this.promise.catch(() => {}).then(() => { this.promise.done = true; });
         retVal = true;
     }

Обратите внимание на пустой обработчик catch(), это важно для того, чтобы обработчик вызывал независимо от результата обещания. Возможно, вы захотите обернуть это в функцию, хотя для того, чтобы сохранить код DRY.

Ответ 2

class RunTest {
   constructor() {
    this.isRunning = false;
   }
   start() {
      console.log('isrunning', this.isRunning);
      var retVal = false;
      if(!this.isRunning) {
        this.promise = this.someTest();
        this.promise.catch().then(() => { this.isRunning = false; });
        retVal = true;                
      }
      return retVal;
    }
    someTest() {
        this.isRunning = true;
        return new Promise((resolve, reject) => {
          setTimeout(function() {
             //some tests go inhere
             resolve();
           }, 1000);
        });
    }
};

var x = new RunTest();

x.start(); //logs false
x.start(); //logs true

setTimeout(function() {
    //wait for a bit
  x.start(); //logs false
}, 2000);