2017-03-21 9 views
1

私は新しい角度になっているので、私は自分が望むものを達成するためのベストプラクティスを知りたいと思います。数値2に基づいた角2のリフレッシュhttpリクエスト

リクエストの間隔が必要な結果が得られるまで、APIをリクエストしたいと考えています。

gifts.service.ts:

import { Injectable } from '@angular/core'; 
import { URLSearchParams } from '@angular/http'; 
import { environment } from '../../../environments/environment'; 
import { Observable } from 'rxjs/Rx'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/catch'; 

import { ApiService } from './api.service'; 
import { Gift } from '../models'; 

@Injectable() 
export class GiftsService { 
    constructor (
    private apiService: ApiService 
) {} 

    get(id): Observable<Gift> { 
    return this.apiService.get('/gifts/' + id) 
      .map(data => data); 
    } 
    ... 

api.service.ts

import { Injectable } from '@angular/core'; 
import { environment } from '../../../environments/environment'; 
import { Headers, Http, Response, URLSearchParams } from '@angular/http'; 
import { Observable } from 'rxjs/Rx'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/catch'; 

import { JwtService } from './jwt.service'; 

@Injectable() 
export class ApiService { 
    constructor(
    private http: Http, 
    private jwtService: JwtService 
    ) {} 

    get(path: string, params: URLSearchParams = new URLSearchParams()): Observable<any> { 
    return this.http.get(path, { headers: this.setHeaders(), search: params }) 
    .catch(this.formatErrors) 
    .map((res:Response) => res.json()); 
    } 
... 

そして私

は、私は2つのネストされたサービス(GiftsServiceとApiService)を使用します次のようなコンポーネントでGiftsService.getを呼び出します。

this.giftsService.get(this.gift.id) 
.subscribe(data => { 
    // if data.status != "ok" retry 
}) 

更新

ここで私は

this.giftsService.get(this.gift.id) 
     .switchMap(data => data.status !== 'success' ? Observable.throw(new Error('status not successful')) : Observable.of(data)) 
     .retryWhen(attempts => { 
     return Observable 
     .range(1,10) 
     .zip(attempts, function(i) { 
      return(i); 
     }) 
     .flatMap(function(i) { 
      return Observable.timer(1000); 
     }) 
     }) 
     .subscribe((
     data => { 
      this.gift = data 
     }) 
    ); 
+0

this.giftsService.get(this.gift.id) .subscribe(データ=> {// data.statusあれば!= "OK" は再試行し、エラー=>サービスを呼び出す...... =エラー } –

+0

rxjs retrywhen演算子は次のように使用できます:http://stackoverflow.com/questions/40175255/angular2-rxjs-how-to-retry-from -inside-subscribe –

答えて

1

それをどうやったのかあなたはこのような何か行うことができます。

this.giftsService.get(this.gift.id) 
    .switchMap(data => data.status !== 'OK' ? Observable.throw() : Observable.of(data)) 
    .retryWhen(errors => { /* setup retry logic here */ }) 
    .subscribe(data => {}) 
+0

私にとって最高のソリューション、ありがとう – loicb

0

あなたは可能性がrangetimerとの組み合わせでretryWhen演算子を。例えばサービスをヒットする誤差関数の再試行で

get(path: string, params = new URLSearchParams()) { 
    return this.http.get(path, { 
     headers: this.setHeaders(), search: params 
    }) 
    .map(response => { 
    response = response.json(); 
    if(response.status !== 'ok') { 
     throw new Error('status not okay'); 
    } 
    return response; 
    }) 
    .retryWhen(errors => { 
    return Observable 
     .range(1, 3 /* maximum retry attempts */) 
     .zip(errors) 
     .flatMap([attempt, error] => { 
     if(attempt >= 3) { 
      return Observable.throw(error); 
     } 
     return Observable.timer(attempt*500 /* the retry timeout which increases after each attempt */); 
     }) 
    }) 
    .catch(this.formatErrors) 
} 
関連する問題