私はAngular 6、ngrx/storeを使用しています。物事を更新する責任があるような効果があります。ロジックによっては、異なるアクションをディスパッチしたいのです。switchMap
instedを使用する場合の違いは何ですか? of map
?
これは私が試したものですが、うまくいきません:
@Effect()
dispathMultipleActions$ = this.actions$.pipe(
ofType(ActionTypes.UpdateSomething),
map(() => {
const actions: Action[] = [];
const array = [1, 2, 3, 4, 5];
array.forEach(item => {
if (item > 3) {
actions.Push(new DeleteAction(item));
} else {
actions.Push(new ChangeAction(item));
}
});
return actions;
})
);
エフェクトは一連のアクションを変換するため、入力および出力として一連のアクションがあります。この例では、アクションをアクションの配列にマップします。アクションの配列のストリームは有効な出力タイプではありません。その配列をフラット化する必要があります。つまり、配列自体を出力ストリームに放出せず、その各要素を放出します。
の代わりに:
input: --a-------a------>
output: --[b,c]---[b,c]-->
やったほうがいい:
input: --a-------a------>
output: --b-c-----b-c-->
配列のObservableを各要素のObservableにフラット化するには、演算子mergeMap
、switchMap
、exhaustMap
のいずれかを使用できます。ほとんどの場合、mergeMap
が正しい選択です。これらの演算子について詳しく知りたい場合は、この answer をご覧ください。
@Effect()
register$: Observable<Action> = this.actions$.pipe(
ofType(AuthActionTypes.REGISTER_REQUEST),
mergeMap((action: RegisterRequest) => {
// check for register request success
return [
new RegisterSuccess(),
new LoginRequest(action.payload)
]
})
);