重要な点は、action$
は、すべてのアクションがディスパッチされたときのホット/マルチキャストストリームであることです(これはSubjectです)。それが熱くなるので、我々はそれを複数回組み合わせることができ、彼らはすべて同じ行動の流れを聞いているでしょう。
// uses switchMap so if another PAGINATION_CLICKED comes in
// before FETCH_SUCCESS we start over
action$
.ofType(PAGINATION_CLICKED)
.switchMap(() =>
action$.ofType(FETCH_SUCCESS)
.take(1) // <-------------------- very important!
.map(() => analyticsAction())
.takeUntil(action$.ofType(FETCH_ERROR))
);
だから我々はPAGINATION_CLICKED
を受け取るたびに、我々は、単一のFETCH_SUCCESS
をリッスンその内側の観察可能なチェーンを聴き始めます。それ以外の理由で、FETCH_SUCCESS
が奇妙なバグの原因となる可能性があり、そうでない場合でも必要なものだけを取ることが一般的にベストプラクティスであるため、引き続きこれを聞きますので、.take(1)
が重要です。
FETCH_ERROR
を最初に受け取った場合は、takeUntil
を使用してFETCH_SUCCESS
の待機をキャンセルします。ボーナスとして
あなたはあまりにもエラーに基づいていくつかの分析ものを行うためにもしたい決定した場合、次の2つのストリーム間の実際のレースにrace
を使用することができ、やり直すだけではなく。最初に出すもの、勝つ;もう1つは登録解除されています。
action$
.ofType(PAGINATION_CLICKED)
.switchMap(() =>
Observable.race(
action$.ofType(FETCH_SUCCESS)
.take(1)
.map(() => analyticsAction()),
action$.ofType(FETCH_ERROR)
.take(1)
.map(() => someOtherAnalyticsAction())
)
);
は、ここで同じことだが、代わりに静的なもののインスタンスオペレーターとしてrace
を使用します。これはあなたが選ぶことができる文体の好みです。彼らはどちらも同じことをします。あなたにはっきりしたものを使用してください。
action$
.ofType(PAGINATION_CLICKED)
.switchMap(() =>
action$.ofType(FETCH_SUCCESS)
.map(() => analyticsAction())
.race(
action$.ofType(FETCH_ERROR)
.map(() => someOtherAnalyticsAction())
)
.take(1)
);
私はほとんどそこに着いた!私はあなたの最初の例で終わりましたが、(今明らかに重要な) 'take(1)'はありませんでした。これは、基本的に、最初の "PAGINATION_CLICKED"の後に "シーケンス"が無視されたことを意味していました。ありがとう、図書館の素晴らしいサポート:) –
あなたは大歓迎です!乾杯。 – jayphelps