2017-02-08 8 views
1

a.loadb.loadという2つのアクションがあり、それらの背後には@effectが登録されており、cのHTTP呼び出しを行います。しかし、ページロード時に、abの両方のアクションが送出され、結果としてcが2回要求されるという問題が発生します。このページでは、aまたはbが変更される可能性があります。その場合は、cの新しい値を取得するリクエストが必要なため、両方のアクションに対応する必要があります。1つのエフェクトと複数のアクションによる複数のHTTP要求

これを処理/回避する方法はありますか?エフェクト内の以前のリクエストをキャンセルすることもできますか?

ありがとうございました。

答えて

1

使用して問題を解決することができるはずthrottle operator - その観察発するまで、光源によって放出された任意の値は無視/絞られる、観察を返し、関数をとります。

throttleに効果を渡すと、低速要求が処理されている間に受け取ったすべてのアクションは無視されます。たとえば:

import 'rxjs/add/operator/throttle'; 

@Effect() 
someEffect = this.actions 
    .ofType(SOME_REQUEST) 
    .throttle(() => this.someEffect) 
    .switchMap((action) => someSlowRequest(action.payload) 
     .map((result) => ({ type: SOME_RESPONSE, payload: result })) 
     .catch((error) => Observable.of({ type: SOME_ERROR, payload: error })) 
    ); 

あなたはHTTPベースの効果で、このようにthrottleを使用する場合は、保留中のHTTP要求がある場合は無視効果を誘発する任意のアクションが表示されます。それがあなたが求めている行動なら、あなたの問題を解決するはずです。あなたのコメントについて

、あなたが密集したアクションの最後を処理する場合は、あなたが使用して検討することもできauditTime operator - 指定された期間を待っていますし、その後、最も最近受信した値発するであろう:

import 'rxjs/add/operator/auditTime'; 

@Effect() 
someEffect = this.actions 
    .ofType(SOME_REQUEST) 
    .auditTime(100) 
    .switchMap((action) => someSlowRequest(action.payload) 
     .map((result) => ({ type: SOME_RESPONSE, payload: result })) 
     .catch((error) => Observable.of({ type: SOME_ERROR, payload: error })) 
    ); 

switchMap演算子を使用するだけで、新しい値を受け取った時点で登録を解除することができます。しかし、私の理解では、ngrxアクションが同期的にディスパッチされるため、各アクションに対してHTTPリクエストが行われる可能性が高く、実装がどのように取り消しを管理するのか分かりません。

+0

この提案をお寄せいただきありがとうございますが、私は注意する必要があります、私は最後の呼び出しをしたいと思います。リクエストから退会してリクエストをキャンセルできますか? – maddockst

+0

ありがとうございました。私はrxjsオペレータを見てみる必要があると思います – maddockst

+1

私は答えを更新しました。 – cartant

関連する問題