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操作。
与flatMap
或concatMap
在于,只要下一个触发器发出,当前的asynchronous操作就会被取消并重新触发。
在你的情况下,这意味着只要路由参数发生变化,你的英雄服务会自动再次被改变的参数调用,并且前面的呼叫被取消,所以你不会收到过时的数据。
这对search查询来说尤其有用,这可能需要200-300ms的时间,并且在用户input时触发。
下面的代码不会一样吗?
没有。虽然在许多情况下它可能performance相同,但是如果您想象下面的情况:
- 参数更改为“4”
-
getHero(4)
(一个非常缓慢的请求) - 参数更改为“1”
-
getHero(1)
(快速请求) -
getHero(1)
完成 – >英雄是“1” -
getHero(4)
完成 – >英雄现在是“4”,但最后使用的参数是“1”
在这种情况下,一旦新的触发器发生, switchMap
就会丢弃getHero(4)
。