为什么我不能用地图发送多个动作?

Why I can't dispatch multiple action with a map?

我想了解我史诗中的一些东西

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

Uncaught Error: Actions must be plain objects. Use custom middleware for async actions.

第二个不也是第一个流吗?

switchMap 将订阅返回的内部 Observable(在本例中为 of)并重新发送其所有项目。因此 of 发出 3 个项目,这些项目会进一步传播。

另一方面,map 只是获取从其 "project" 函数返回的值并进一步传播它。 map 不关心返回值是什么。没有应用进一步的逻辑。

所以在你的情况下 map 正在传播一个 Observable 的实例,这不是一个有效的动作。