RxJS Redux Observable Epic improvement



我有以下可观察的 Epic https://aws-amplify.github.io/docs/js/authentication#retrieve-current-session,它使用来自 AWS Amplify 的异步Auth.currentSession

所以我基本上有两个异步函数需要调用,实际的 GraphQL 突变排在第二位。

我仍然是RxJS和函数式编程的新手,所以我想知道这是否是处理这个问题的最有效方法。catchError 似乎是重复的,嵌套似乎过火了,但我确实喜欢它如何知道哪个函数有问题。

提前感谢您对改进此代码的任何建议。

const postEpic = (action$, state$) =>
action$.pipe(
ofType(actionTypes.CREATE_POST),
mergeMap(action => {
return from(Auth.currentSession()).pipe(
switchMap(user => {
return from(
client.mutate({
mutation: gql(createPost),
variables: {
createPostInput: {
User_id: user.getIdToken().payload.id,
title: action.payload.title
}
}
})
).pipe(
map(response => createPostSuccess()),
catchError(error => of(createPostError(error)))
);
}),
catchError(error => of(createPostError(error)))
);
})
);

整体看起来不错。我稍微引用了代码以减少复杂性和嵌套。我更喜欢重复热可观察而不是嵌套捕获。catchError 完成了可观察量,因此在您的原始代码中,如果它在外流中失败,您的流将被停止,这可能是唯一的问题。

const postEpic = (action$, state$) =>
action$.pipe(
ofType(actionTypes.CREATE_POST),
mergeMap(action => from(Auth.currentSession()),user=>[user,action.payload.title]),
switchMap(([user,title]) =>client.mutate({
mutation: gql(createPost),
variables: {
createPostInput: {
User_id: user.getIdToken().payload.id,
title
}
}
})),
map(response => createPostSuccess()),
catchError(error => of(createPostError(error))),
repeat()
);

最新更新