webentwicklung-frage-antwort-db.com.de

So prüfen Sie, ob eine Zusage aussteht

Ich habe diese Situation, in der ich wissen möchte, wie der Status eines Versprechens ist. Im Folgenden ruft die Funktion start nur noch someTest auf, wenn sie nicht mehr ausgeführt wird (Versprechen steht nicht mehr aus). Die Funktion start kann viele Male aufgerufen werden, aber wenn sie aufgerufen wird, während die Tests noch laufen, wartet sie nicht und gibt nur false zurück.

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

Ich kann nicht einfach den Status eines Versprechens überprüfen. So etwas wie this.promise.isPending wäre nett :) Jede Hilfe wäre dankbar!

38

Sie können einen then -Handler anfügen, der ein done -Flag für das Versprechen setzt (oder die RunTest -Instanz, wenn Sie dies vorziehen), und Folgendes testen:

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

Beachten Sie den leeren catch() -Handler. Es ist wichtig, dass der Handler unabhängig vom Ergebnis des Versprechens aufgerufen wird. Wahrscheinlich möchten Sie das in eine Funktion packen, um den Code DRY zu behalten.

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