5

新しいリクエストがトリガーされるたびにユースケースがあり、すでに進行中の http リクエストはキャンセル/無視する必要があります。

  • リクエスト #1 の応答に時間がかかりすぎる/ネットワーク接続が遅くなる間に、リクエスト (#2 など) が着信します。
  • この場合、#2 はサーバーから非常に迅速な応答を取得し、任意の時点で #1 が応答を返したとしても、観測可能な HTTP 応答は無視する必要があります。
  • 私が直面している問題は、最初にコンポーネントがリクエスト#2からの応答値を表示し、リクエスト#1が完了すると再び更新されることです(これは発生しないはずです)。

switchMap はオブザーバブルをキャンセルし、オブザーバブル値が発行される順序を維持すると考えました。

私のservice.tsからの抜粋

Obervable.of('myServiceUrl')
             .switchMap(url => this.httpRequest(url) )
              .subscribe( response => {
                   // implementation
                   /** Update an observable with the 
                       with latest changes from response. this will be 
                       displayed in a component as async */
                });


private httpRequest(url) {
        return this.httpClient.get('myUrl', { observe: 'response' });
}

上記の実装は機能しません。このユースケースの正しい実装を誰かが理解できますか。

4

2 に答える 2

11

複数のオブザーバブルを作成しているようです。あなたの例からはわかりObservable.ofませんが、リクエストを行うたびに呼び出すようです。これにより、毎回新しいObservable ストリームが作成されるため、後続の呼び出しごとに新しいストリームが取得され、前のストリームはキャンセルされません。これが機能しない理由.switchMapです。

HTTP リクエストをキャンセルする場合は、同じ監視可能なストリーム.switchMapを使用する必要があります。使用するソース Observable は、http リクエストをトリガーしているものによって異なりますが、.Subject

const makeRequest$ = new Subject();
const myResponse$ = makeRequest$.pipe(switchMap(() => this.service.getStuff()));

にサブスクライブしmyResponse$て、応答を取得できます。リクエストをトリガーしたいときはいつでも実行できますmakeRequest$.next()

于 2018-02-28T18:35:39.513 に答える