2016-10-14 6 views
4

バックエンドから15秒ごとにデータを取得するとします。私のコードは次のようになります。Angular2保留中のリクエストがあるときにHTTP要求をキューに入れないようにする

TestComponent:

public ngOnInit(): void { 
    Observable.timer(0, 15000).subscribe(() => { 
     this.callService(); 
    }); 
} 
private callService(): void { 
    this.testService.callBackendService().subscribe(data => { 
     this.data = data; 
    }); 
} 

TestService:

public callBackendSerivce(): Subscribable<Data> { 
    return this.http.get(this.serviceUrl) 
        .map(this.extractData) 
        .catch(this.handleError); 
} 
問題は、バックエンドで何らかのエラーが発生したときの処理時間がより多くかかるということです

15秒後に、このコードはバックエンドサービスに再度アクセスし、再び応答を待つことはありません。私はそのような行動を防ぎ、以前の電話からの応答を受け取ったときにだけ電話をかけたい。これを実装する方法は?

私はそれは次のようになります考えた:これを行うに任意のより良い解決策はあり

  1. TestComponent:

    public ngOnInit(): void { 
        this.callService(); 
    } 
    
    private callService(): void { 
        this.testService.callBackendService().subscribe(data => { 
         this.data = data; 
         this.subscribeToService(); 
        }); 
    } 
    
    private subscribeToService(): void { 
        this.timerSubscription= Observable.timer(15000).subscribe(() => { 
         this.callService(); 
         this.timerSubscription.unsubscribe(); 
        }); 
    } 
    

    2つの質問?

  2. いいえ - Observable.timerに最初の結果を取得して自動的に退会する方法はありますか?このコードを追加することはできません:

    this.timerSubscription.unsubscribe();

答えて

1

第二の点によれば、次の2つの可能性があります

Observable.first().subscribe(...) 

又は

Observable.take(1).subscribe(...) 

first()観測ソースからのみ1つのアイテムを放出することを意味します。 take()では、(引数として)購読したい回数を設定することができます。

0

あなたはこのようなタイマーにswitchMap演算子を使用する必要があります。

Observable.timer(0, 15000).switchMap(() => this.callService()).subscribe(); 

この callService 15秒ごとに呼び出します。

何らかの理由でcallServiceがエラーをスローすると、switchMapのタイマーが自動的に完了します。

最初の値がcallServiceの場合は、タイマーなしで呼び出すだけです。

HTTPコールは、値を正常に返すと常に完了します。したがって、それらのメンバーは、購読を解除する必要はありません。

callServiceを15秒後に呼び出す場合は、timerの遅延を使用する必要があります。

Observable.timer(15000).switchMap(...)

再試行に関しては失敗した後、私はすべてのHTTP要求が保留されている場合、バックエンドサービスを呼び出すようにしたいhttp://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-retry

+0

retryオペレータをチェックしてください。あなたの例では、保留中のリクエストがある場合、私はこのリクエストをキャンセルして新しいコールを行います。これは私が探しているものではありません。 – Toma

関連する問題