web-dev-qa-db-ja.com

Promiseが保留中かどうかを確認する方法

私はこの状況で、約束のステータスが何であるかを知りたいです。以下では、関数startは、もう実行されていない場合にのみsomeTestを呼び出します(Promiseは保留されていません)。 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のようなものがいいでしょう:)どんな助けでも感謝します!

38

Promiseに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に保つために関数でラップする必要があります。

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