switchMap
和其他转换操作符的主要区别是它具有取消效果。在每次发出时,会取消前一个内部observable(你所提供函数的结果)的订阅,然后订阅一个新的observable。可以通过短语切换成一个新的observable来记忆它。
将每个源投射成Observable,该Observable会合并输出到Observable中,并且只发出最新投射的Observable中的值。
将每个值映射成Observable,然后使用switch打平所有的内部Observable。
返回的Observable基于应用的一个函数来发送项,该函数提供给源Observable发出的每个项,并返回一个(所谓的“内部)Observable。每次观察到这些内部Observable的其中一个时,输出Observable将开始发出该内部Observable所发出的项。当发出一个新的内部Observable时,switchMap会停止发出先前发出的内部Observable并开始发出新的内部Observable的值。后续的内部Observable也是如此。
例如,点击按钮就重新泛起一个interval:
1 | const source = fromEvent(this.submitBtn.nativeElement, 'click'); |
例如,从url中接受参数以复用这个页面:
1 | this.activatedRoute.paramMap.pipe( |
写一个测试函数:
1 | constructor( |
这样,url变化的时候,接收到的url里面的参数id都会是最新的。
这里of
操作符是创建简单的Observable,该Observable只发出给定的参数,在发送完这些参数后发出完成通知。
可以尝试下,不加of
操作符的时候监听paramMap
时,对应的参数有多长,就会在subscribe
里输出多少次,这明显不合理的,加上of
操作符后,就可以打平paramMap
这个Observable.