Rxjs:取决于可观察值,使用mergeMap或switchMap管道

问题描述 投票:1回答:1

我们有一个执行http请求的请求服务。所有请求都实现了IRequest接口,该接口包含http方法和execute函数,而execute函数又返回另一个observable。

RequestService有一个重载,它接受一个source observable和一个requestfactory,它根据source observable的值返回一个IRequest实例。

export interface IRequest<TResponse> {
    __method: string;
    execute(): Observable<TResponse>;
}

class RequestService<TSource, TResponse> {
    public execute(source: Observable<TSource>, requestFactory: (input: TSource) => IRequest<TResponse>): Observable<TResponse> {
        return source.pipe(
            map(x => requestFactory(x)),
            switchMap(x => x.execute()),
        );
    }
}

当然,在服务中做了很多(日志记录,默认错误处理......),但大多数都与问题无关。

现在,这一切都像魅力,但我们想要做的是,默认情况下使用switchMap进行GET请求,并使用'mergeMap'进行POST,PUT,DELETE请求。

我们似乎无法让这个工作。我们需要在工厂创建之后访问IRequest实例,这只有在我们有源可观察值的情况下才有可能。但是,在运算符中,我们无法再控制switchMap或mergeMap之间的选择。

我们的下一个选择是创建我们自己的RequestMapOperator,它将创建MergeMapOperatorSwitchMapOperator的实例,并使用适当的next,complete和error方法。但是,qxxswpoi不会被rxjs库导出。

因此,在创建我们自己的订阅者类之前,它只是SwitchMapOperatorMergeMapSubscriber的组合,我们想知道我们是否遗漏了一些东西。


TL; DR

我们想要一个运算符,它根据source observable的值,使用mergeMap或switchMap展平到一个新的observable。

rxjs rxjs6
1个回答
0
投票

你可以使用RXJS iif函数,它将条件函数作为第一个参数,并根据返回的值决定哪个observable可以订阅。

例如。

SwitchMapSubscriber

希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.