2017-08-18 2 views
2

操作を再試行するための再試行ロジックがあります。 1回のリクエストでうまく動作します。複数の進行中の要求については、再試行する前に既存の再試行ロジックが完了するのを待っています。Rxjs observableが何らかの条件が満たされるまで待機する

handleError(errors: Observable<any>) { 

    const retryCountStart: number = 1; 

    // wait if there is any existing operation retrying 
    // once it is complete, continue here 

    return errors 
     .mergeScan<any, any>(
     (retryCount: any, err: any) => { 

      if (retryCount <= 5) { 
       return Observable.of(retryCount + 1); 
      } 

     },retryCountStart) 
     .delay(1000); 
} 

上記の方法で条件が満たされるまでに遅延を追加するにはどうすればよいですか?

答えて

0

あなたは約束を決意して、その目的のためにasync/awaitを使用することができます迅速な応答を

async handleError(errors: Observable<any>) { 

    const retryCountStart: number = 1; 

    // wait if there is any existing operation retrying 
    // ---------------------------------------------------------- 
    await new Promise(resolve => { 
     // declare some global variable to check in while loop 
     while(this.retrying){ 
      setTimeout(()=> { 
       // Just adding some delay 
       // (you can remove this setTimeout block if you want) 
      },50); 
     } 

     // when while-loop breaks, resolve the promise to continue 
     resolve(); 
    }); 
    // ---------------------------------------------------------- 

    // once it is complete, continue here 

    return errors 
     .mergeScan<any, any>(
     (retryCount: any, err: any) => { 

      if (retryCount <= 5) { 
       return Observable.of(retryCount + 1); 
      } 

     },retryCountStart) 
     .delay(1000); 
} 
+0

感謝を。 async/awaitを使用すると、私の呼び出し元関数をすべてasyncで更新する必要があると思います。非同期/待たずにそれを達成することは可能ですか? – developer

+0

いいえ、あなたはそれの前に 'async'を使わなければなりません。私は' handleError'メソッドの前に答えを加えました。 – Faisal

+0

他の解決策がある場合は、私はそれを認識していません。私は私のプロジェクトで何のエラーもなくこれを使用しています:) – Faisal

関連する問題