2017-09-18 10 views
2

私は、HTTP「202 Accepted」応答を返すAPIを使用しており、長時間実行されているリクエストの処理を開始します。レスポンスコードに基づいて遅れて角度の投稿要求を再試行する方法

私はHTTPの "200 OK"応答を受信するまで、遅延の後に同じ要求を送信する必要があります。その時点で、応答本体から結果を照会できます。

私はドキュメントを見直して、エラー時に再試行の例をいくつか見つけましたが、成功を遅らせると再試行する方法が見つかりません。

import { Injectable } from '@angular/core'; 
import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http'; 
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/observable/throw'; 
import 'rxjs/add/operator/catch'; 
import 'rxjs/add/operator/do'; 

@Injectable() 
export class WebService { 

    private _serviceUrl = 'https://webservice.com/api/long_request'; 

    constructor(private _http: HttpClient) { } 

    getData() { 

    let body = JSON.stringify({ 
     "time_properties": 
     { 
     "start_date": "2017-08-10", 
     "end_date": "2017-08-14"   
     } 
    }); 

    return this._http.post(this._serviceUrl, body) 
     .do(data => console.log('All: ' + JSON.stringify(data))) 
     .catch(this.handleError); 
    } 

    private handleError(err: HttpErrorResponse) { 
    console.error(err.message); 
    return Observable.throw(err.message); 
    } 
} 
+0

を開始再試行しますObservable.js〜Observable.html#instance-method-repeatWhen – martin

+0

「retryWhen()」を使用できます:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-retryWhen – Supamiu

答えて

1

前述のように、このように再試行します。これは、あなたが成功のための500エラー

.retryWhen((errors) => { 
      return errors.scan((errorCount, err) => { 
       if (this.isNoUserError(err, this.unwrapHttpError(err))) { 
        if(errorCount >= 3) { 
         // return Observable.throw(); 
         throw err; 
        } 
        return errorCount++; 
       } else { 
        throw err; 
       } 
      }, 0); 
     }) 

private isNoUserError(error, unwrapError) { 
     return error.status === 500 && !!unwrapError && unwrapError.errorKey === "NO_USER"; 
    } 


private unwrapHttpError(error: any): any { 
     try { 
      return (error.json()); 
     } catch (jsonError) { 
      return ({ 
       code: -1, 
       message: "An unexpected error occurred." 
      }); 
     } 
    } 

を持っていたときに3回だけであなたは `repeatWhen()` http://reactivex.io/rxjs/class/es6/を使用することができ、再び

loadSomething() { 
    this.http.load().then(() => { 
    if (code=== 202) { 
    this.loadSomehitng(); 
    } 
    }) 
} 
+0

retryWhenがエラーステータスでしか動作しないため、HTTP 202で再試行する必要があります。 – Simon

+0

@Simon – alexKhymenko

関連する問題