Lev*_*Lev 27 redux ngrx angular
我想在一个效果中发送两个动作.目前我必须声明两个效果来实现这一目标:
// first effect
@Effect() action1$ = this.actions$
.ofType(CoreActionTypes.MY_ACTION)
.map(res => {
return { type: "ACTION_ONE"}
})
.catch(() => Observable.of({
type: CoreActionTypes.MY_ACTION_FAILED
}));
// second effect
@Effect() action2$ = this.actions$
.ofType(CoreActionTypes.MY_ACTION)
.map(res => {
return { type: "ACTION_TWO"}
})
.catch(() => Observable.of({
type: CoreActionTypes.MY_ACTION_FAILED
}));
Run Code Online (Sandbox Code Playgroud)
是否可以通过单一效果成为一个动作的源头?
小智 45
@Effect()
loadInitConfig$ = this.actions$
.ofType(layout.ActionTypes.LOAD_INIT_CONFIGURATION)
.map<Action, void>(toPayload)
.switchMap(() =>
this.settingsService
.loadInitConfiguration()
.mergeMap((data: any) => [
new layout.LoadInitConfigurationCompleteAction(data.settings),
new meetup.LoadInitGeolocationCompleteAction(data.geolocation)
])
.catch(error =>
Observable.of(
new layout.LoadInitConfigurationFailAction({
error
})
)
)
);
Run Code Online (Sandbox Code Playgroud)
max*_*992 11
你可以使用switchMap和Observable.of.
@Effect({ dispatch: true }) action$ = this.actions$
.ofType(CoreActionTypes.MY_ACTION)
.switchMap(() => Observable.of(
// subscribers will be notified
{type: 'ACTION_ONE'} ,
// subscribers will be notified (again ...)
{type: 'ACTION_TWO'}
))
.catch(() => Observable.of({
type: CoreActionTypes.MY_ACTION_FAILED
}));
Run Code Online (Sandbox Code Playgroud)
表现很重要:
您可能希望查看redux-batched-actions,而不是分派许多会在发送时多次触发所有订阅者的操作.
这允许您仅在所有这些多个操作都应用于商店时警告您的订户.
例如 :
@Effect({ dispatch: true }) action$ = this.actions$
.ofType(CoreActionTypes.MY_ACTION)
// subscribers will be notified only once, no matter how many actions you have
// not between every action
.map(() => batchActions([
doThing(),
doOther()
]))
.catch(() => Observable.of({
type: CoreActionTypes.MY_ACTION_FAILED
}));
Run Code Online (Sandbox Code Playgroud)
您可以选择mergeMap异步或concatMap同步
@Effect() action$ = this.actions$
.ofType(CoreActionTypes.MY_ACTION)
.mergeMap(() => Observable.from([{type: "ACTION_ONE"} , {type: "ACTION_TWO"}]))
.catch(() => Observable.of({
type: CoreActionTypes.MY_ACTION_FAILED
}));
Run Code Online (Sandbox Code Playgroud)
如果有人想知道如何将简单动作与Observables中的动作混合使用。
我陷入了相同的任务,但差别很小:我需要分派两个动作,第二个动作是在API调用之后进行的,这使其成为可观察的。就像是:
action1 只是一个动作: {type: 'ACTION_ONE'}action2 API调用是否映射到操作: Observable<{type: 'ACTION_TWO'}> 以下代码解决了我的问题:
@Effect() action$ = this.actions$.pipe(
ofType(CoreActionTypes.MY_ACTION),
mergeMap(res =>
// in order to dispatch actions in provided order
concat(
of(action1),
action2
)
),
catchError(() => Observable.of({
type: CoreActionTypes.MY_ACTION_FAILED
}))
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23188 次 |
| 最近记录: |