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 一个动作不包装它。
我正在学习在 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 一个动作不包装它。