我试图了解我的史诗里面的东西
const loginEpic = (action$, state$) => action$.pipe(
ofType(UsersActions.loginRequest),
switchMap((action: {payload:{email: string, password: string}}) =>
HttpService.PostAsync<apiModels.api_token_auth_request, apiModels.api_token_auth_response>('token-auth', action.payload).pipe(
switchMap(response => {
let token = response && response.data && response.data.token ? response.data.token : '';
return of(
UsersActions.setUserAuth({authKey: token}),
UsersActions.loginSuccess(),
WorkspaceActions.getWorkspacesRequest()
);
}),
catchError((error: string) => {
return of(UsersActions.loginFailed({error}));
})
)
)
);
这为什么起作用
switchMap(response => {
let token = response && response.data && response.data.token ? response.data.token : '';
return of(
UsersActions.setUserAuth({authKey: token}),
UsersActions.loginSuccess(),
WorkspaceActions.getWorkspacesRequest()
);
}),
但这不起作用
map(response => {
let token = response && response.data && response.data.token ? response.data.token : '';
return concat(
of(UsersActions.setUserAuth({authKey: token})),
of(UsersActions.loginSuccess()),
of(WorkspaceActions.getWorkspacesRequest())
);
}),
未捕获的错误:动作必须是纯对象。使用自定义中间件 进行异步操作。
第二个不是第一流吗?
答案 0 :(得分:4)
switchMap
将订阅返回的内部Observable(在这种情况下为of
)并重新释放其所有项目。因此of
发出3个项目,并进一步传播。
另一方面,map
仅采用从其“项目”函数返回的值,并将其进一步传播。 map
不在乎返回的值是什么。不再应用任何逻辑。
因此,在您的情况下,map
正在传播Observable实例,这不是有效操作。