web-dev-qa-db-fra.com

Comment vérifier si une promesse est en attente

J'ai cette situation dans laquelle j'aimerais savoir quel est le statut d'une promesse. Ci-dessous, la fonction start appelle uniquement someTest si elle ne s'exécute plus (la promesse n'est pas en attente). La fonction start peut être appelée plusieurs fois, mais si elle est appelée alors que les tests sont toujours en cours d'exécution, elle ne va pas attendre et renvoie simplement 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
        });
    }
}

Je ne peux pas trouver un moyen de vérifier simplement le statut d'une promesse. Quelque chose comme this.promise.isPending serait bien :) Toute aide serait appréciée!

38
Jeanluca Scaljeri

Vous pouvez attacher un gestionnaire then qui définit un indicateur done sur la promesse (ou l'instance RunTest si vous préférez), et vérifiez que:

     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;
     }

Remarquez le gestionnaire vide catch(), il est crucial de pouvoir appeler le gestionnaire quel que soit le résultat de la promesse. Vous voudrez probablement inclure cela dans une fonction afin de garder le code au sec.

19
Amit
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);
1
Daniel Graham