Redux-observable 分派多个动作

Redux-observable dispatching multiple actions

我正在学习在 react-native 中使用 redux-observable 和 RxJS,然后我在执行 Firestore 获取文档请求后遇到调度多个操作的问题。

这是我的史诗:

const getUserEpic: Epic = action$ => {
  return action$.pipe(
    filter(signIn.match),
    switchMap(action => {
      let usecase = container.resolve<SignInUseCase>('SignInUseCase');
      return concat(
        of(signInBegin()),
        usecase.call(action.payload).pipe(
          map(res => {
            if (res !== undefined) return saveUser(res);
            return signInFailed();
          }),
        ),
      );
    }),
  );
};

基本上,我试图在分派名为“signIn”的操作后分派许多操作。 “用例”正在执行 Firestore 获取文档。响应后 收到后,我想发送两个动作,“saveUser”和“signInSuccess”。但是,如果响应未定义,则必须调度操作“signInFailed”而不是上面的两个。

代码应该是这样的:

...
        usecase.call(action.payload).pipe(
          map(res => {
            if (res !== undefined) 
               return {
                   saveUser(res);
                   signInSuccess();
               }
            return signInFailed();
          }),
        ),

请帮我更正代码!感谢您抽出宝贵时间!

顺便说一句,这是 SignInUseCase:

@injectable()
export class SignInUseCase implements UseCase<SignInResult, any> {
  constructor(
    @inject('AuthenticationRepository')
    private readonly authenticationRepository: AuthenticationRepository,
  ) {}

  call(param?: any): Observable<SignInResult> {
    return this.authenticationRepository.signIn(param);
  }
}

AuthenticationRepository 的实现:

export class AuthenticationRepositoryImpl implements AuthenticationRepository {
  signIn(credential: any): Observable<SignInResult> {
    return from(getUser(credential.phone_number));
  }
}

这是从 Firestore 获取文档的函数“getUser”:

export const getUser = async (phoneNumber: string) => {
  const doc = await firestore()
    .collection('users')
    .doc(phoneNumber)
    .get()
    .catch(e => {
      Alert.alert('Error: ', e);
    });

  return doc.data();
};

你可以return一个数组在switchMap中,所以解决方法很简单:

    usecase.call(action.payload).pipe(
      switchMap(res => {
        if (res !== undefined) 
           return [
               saveUser(res),
               signInSuccess()
           ]
        return [signInFailed()]
      }),
    ),

这将发出数组中的所有动作。

请记住,如果您使用 switchMap,那么您从中 return 得到的所有内容都必须是“ObservableLike”。一个数组是一个 ObservableLike,也是一个 Observable,但是你不能 return 一个动作不包装它。