Angular 6升级后ng lint提示combineLatest已弃用,如何解决?
嘿,这个问题我熟!RxJS 6在操作符的使用上做了不少规范调整,刚好踩过类似的坑,给你捋清楚怎么改:
首先,你遇到的第一个警告是因为RxJS 6彻底移除了操作符的resultSelector参数——也就是原来那种把回调函数直接放在combineLatest参数里的写法已经被弃用了,必须改用pipe搭配map操作符来处理结果。
然后第二个警告是因为你用了实例版的combineLatest(也就是在pipe里直接调用的那个),RxJS 6已经弃用了实例方法的combineLatest,推荐使用静态版本的combineLatest;另外empty()也确实被弃用了,现在要换成大写的EMPTY常量(不过其实你这个场景根本不需要用到空Observable,后面细说)。
正确的写法应该是这样:
先确保导入正确的操作符和方法:
import { combineLatest } from 'rxjs'; import { map } from 'rxjs/operators';
然后把原来的代码改成静态combineLatest+pipe(map)的形式:
const a$ = combineLatest( this.aStore.select(b.getAuth), this.cStore.select(b.getUrl) ).pipe( map(([auth, url]) => ({ auth, url })) );
为啥这么改?
- 静态
combineLatest:RxJS 6推荐优先使用静态方法来组合多个Observable,实例版的combineLatest因为容易混淆行为被标记为弃用。 - 用
map替代结果选择器:所有需要对Observable结果做转换的逻辑,都统一放到pipe里的map操作符中,这是RxJS 6的规范,让代码的数据流更清晰。
如果你确实需要在pipe链中组合Observable(比如前面还有其他操作):
比如你有一个上游的Observable,要和另外两个Store的Observable组合,那可以这样写:
import { combineLatest, of } from 'rxjs'; import { map, mergeMap } from 'rxjs/operators'; // 假设上游有一个source$ source$.pipe( // 用mergeMap把上游值和另外两个Observable组合 mergeMap(sourceVal => combineLatest( of(sourceVal), this.aStore.select(b.getAuth), this.cStore.select(b.getUrl) )), // 再用map处理组合后的结果 map(([sourceVal, auth, url]) => ({ sourceVal, auth, url })) );
另外关于empty()的替代:现在直接导入EMPTY常量即可,它是一个已经创建好的空Observable,用法如下:
import { EMPTY } from 'rxjs'; // 比如需要返回一个空Observable的场景 someFunction(): Observable<any> { if (someCondition) { return EMPTY; } // ...其他逻辑 }
这样改完之后,两个警告应该就都消失啦!
内容的提问来源于stack exchange,提问作者Phaze
相关产品推荐
相关产品推荐

