角度-为什么在使用switchMap用http.get传递route.parame时,可观察的链不会终止

时间:2018-08-08 14:57:19

标签: angular rxjs angular-routing angular-http angular-httpclient

为什么第一条链不完整?

switchMap应该取消订阅先前的可观察性,并且由于http.get是一次性可观察的,所以我认为它将完整记录。

相反,我一直在获取http.get结果。这就是我对flatMap的期望。

    this.route.params
        .pipe(
            switchMap(params => {
                return this.http.get('assets/data/module.json');
            })
        )

        .subscribe(
            res => {
                console.log(res);
            },
            e => e,
            () => console.log('complete')
        );

默认的http.get结果完整。

    this.http.get('assets/data/module.json').subscribe(
        res => {
            console.log(res);
        },
        e => e,
        () => console.log('complete')
    );

1 个答案:

答案 0 :(得分:2)

我认为您在switchMap应该做什么上做错了。如果发出新参数,则switchMap将取消订阅内部可观察的操作(您的http.get调用)。一旦您完成http.get调用,它将不会取消订阅参数。

您想要的是在管道中添加first()运算符,然后再添加switchMap运算符。同样,您可能希望使用switchMap的mergeMap istead,尽管这对您而言并不重要。

this.route.params
    .pipe(
        first(),
        switchMap(params => {
            return this.http.get('assets/data/module.json');
        })
    )

    .subscribe(
        res => {
            console.log(res);
        },
        e => e,
        () => console.log('complete')
    );

这将采用route.params发出的第一个参数,发出您的http请求,然后完成可观察项。

可以使用哪种切换映射的示例: 假设我们有一个搜索字段,我可以在其中输入任何内容。当我在搜索字段中输入内容时,angular将调用后端以检索搜索结果。现在,当上一个搜索请求仍处于待处理状态时,我可以更改搜索词。在这种情况下,switchMap将取消旧的get请求并发出新的请求。