我在分派多个动作时遇到以下效果:
@Effect()
someEffect$ = this.actions$.pipe(
ofType(someAction: Actions),
mergeMap(
(action)=>{
return this.authService.getProfile(action.payload.authInfo).pipe(
map((response: any) => {
if (response.isErrorResponse) {
return new HeaderActions.AuthFail(response);
} else {
//here i'd like to return multiple actions
return [
new HeaderActions.FetchMPInfoSuccess(this.fetchMpInfoSuccesState(getMpProfileResponse)),
new HeaderActions.GetAccountStates(true)
]
}
}),
catchError((error:HttpErrorResponse )=>{
return of(new HeaderActions.AuthFail(response));
})
);
}
)
);
我尝试在return块中添加一系列动作,但这会导致错误,即我未发送有效动作,知道我在做什么错吗?
答案 0 :(得分:3)
您可以使用 switchMap 代替 mergeMap 。 然后使用 flatMap 或 switchMap 代替 map
代码应如下所示:
@Effect()
someEffect$ = this.actions$.pipe(
ofType(someAction: Actions),
switchMap(
(action)=>{
return this.authService.getProfile(action.payload.authInfo).pipe(
flatMap((response: any) => {
if (response.isErrorResponse) {
return new HeaderActions.AuthFail(response);
} else {
//here i'd like to return multiple actions
return [
new HeaderActions.FetchMPInfoSuccess(this.fetchMpInfoSuccesState(getMpProfileResponse)),
new HeaderActions.GetAccountStates(true)
]
}
}),
catchError((error:HttpErrorResponse )=>{
return of(new HeaderActions.AuthFail(response));
})
);
}
)
);
要访问子组件中的数据,可以将这种方法与@Input()集合一起使用:
@Input() set(data: any) {
if (data) { console.log(data) }}
html中的数据将始终存在。
地图修改由源Observable发出的每个项目,并发出修改后的项目。
FlatMap , SwitchMap 还在每个发射的项目上应用了一个函数,但是它不返回修改后的项目,而是返回可以再次发射数据的Observable本身。
FlatMap 合并多个Observable发出的项目,并返回一个Observable。
SwitchMap 与FlatMap有点不同。每当新项目开始发射时,SwitchMap就会从先前的源Observable退订,因此总是从当前Observable发射项目。
如果您想进一步了解rxjs运算符,请查看here。
答案 1 :(得分:-1)
尝试:
@Effect()
someEffect$ = this.actions$.pipe(
ofType(someAction: Actions),
switchMap(
(action)=>{
return this.authService.getProfile(action.payload.authInfo).pipe(
map((response: any) => {
if (response.isErrorResponse) {
return [new HeaderActions.AuthFail(response)];
} else {
//here i'd like to return multiple actions
return [
new HeaderActions.FetchMPInfoSuccess(this.fetchMpInfoSuccesState(getMpProfileResponse)),
new HeaderActions.GetAccountStates(true)
]
}
}),
catchError((error:HttpErrorResponse )=>{
return of(new HeaderActions.AuthFail(response));
})
);
}
)
);
所以基本上我所做的是,不是在服务调用之前使用mergeMap
,而是将其交换回简单的switchMap
。
为什么我从mergeMap
更改它的原因是:您仅从单个流中返回值。