为什么我不能通过地图调度多个动作?

时间:2019-11-01 09:45:47

标签: rxjs redux-observable

我试图了解我的史诗里面的东西

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())
    );
}),
  

未捕获的错误:动作必须是纯对象。使用自定义中间件   进行异步操作。

第二个不是第一流吗?

1 个答案:

答案 0 :(得分:4)

switchMap将订阅返回的内部Observable(在这种情况下为of)并重新释放其所有项目。因此of发出3个项目,并进一步传播。

另一方面,map仅采用从其“项目”函数返回的值,并将其进一步传播。 map不在乎返回的值是什么。不再应用任何逻辑。

因此,在您的情况下,map正在传播Observable实例,这不是有效操作。