Angular 2:为什么在检索路由参数时使用switchMap?

我正在阅读关于路由和导航的Angular Guide 。

他们使用这个代码来检索路由器的参数'id'并用它来获得service服务的英雄:

 ngOnInit() { this.route.params .switchMap((params: Params) => this.service.getHero(+params['id'])) .subscribe((hero: Hero) => this.hero = hero); } 

但是我不明白在上面的代码中使用switchMap操作符的目的是什么。

下面的代码不会一样吗?

 ngOnInit() { this.route.params // NOTE: I do not use switchMap here, but subscribe directly .subscribe((params: Params) => { this.service.getHero(+params['id']).then(hero => this.hero = hero) }); } 

    switchMap通常用于某些由事件/stream引发的asynchronous操作。

    flatMapconcatMap在于,只要下一个触发器发出,当前的asynchronous操作就会被取消并重新触发。

    在你的情况下,这意味着只要路由参数发生变化,你的英雄服务会自动再次被改变的参数调用,并且前面的呼叫被取消,所以你不会收到过时的数据。

    这对search查询来说尤其有用,这可能需要200-300ms的时间,并且在用户input时触发。

    下面的代码不会一样吗?

    没有。虽然在许多情况下它可能performance相同,但是如果您想象下面的情况:

    1. 参数更改为“4”
    2. getHero(4) (一个非常缓慢的请求)
    3. 参数更改为“1”
    4. getHero(1) (快速请求)
    5. getHero(1)完成 – >英雄是“1”
    6. getHero(4)完成 – >英雄现在是“4”,但最后使用的参数是“1”

    在这种情况下,一旦新的触发器发生, switchMap就会丢弃getHero(4)