RxJS-改进操作分支

时间:2018-12-17 10:42:28

标签: rxjs

我正在使用Angular及其HttpClient类。
我需要区分有效调用(HTTP 200)和错误调用(HTTP不是200还是自定义响应)。
目前,我正在使用这种模式:

const httpSource$ = this.httpClient.get<MyType>(url)
const valid$ = httpSource$.pipe(
    filter(result => result.code === 0),
    tap(() => this.logger.debug(...)),
    map(result => Result.valid(result.value))
)
const error$ = httpSource$.pipe(
    filter(result => result.code !== 0),
    tap(() => this.logger.debug(...)),
    map(result => Result.error(result.message, result.value))
)

return merge(valid$, error$).pipe(
    catchError(e => of(Result.error<FunReturnType>>(e.message)))
)

我在正确的道路上?我是否过于复杂(在map运算符上可能只是if-else)?可以进一步简化吗?

1 个答案:

答案 0 :(得分:1)

我认为我建议您考虑做这样的事情:

我假设Result.valid和Result.error都是静态助手,可以通过您的应用将api答案转换为可消耗对象。

httpSource$.pipe(
    tap(() => this.logger.debug(...)),
    map(result => {
        if(result.code === 0) {
            return Result.valid(result.value);
        }
        else {
            Result.error(result.message, result.value);
        }
    }),
    catchError(e => of(Result.error<FunReturnType>>(e.message)))
);

这将解决您的两次通话问题,我猜对于下一个开发人员来说更具可读性。