Angular升级至6后RxJS 6 switchMap弃用警告及参数错误求助
解决RxJS 6适配中的switchMap警告与兼容性问题
嘿,我来帮你搞定这两个RxJS迁移里的问题~
问题1:RxJS 6中switchMap的“Deprecated Symbol is used”警告
你遇到的警告是因为RxJS 6已经弃用了switchMap的第二个参数(结果选择器)。这个参数在RxJS 5里允许你把源Observable的值和内部Observable的值结合处理,但RxJS团队认为这种写法会降低代码可读性,而且不利于调试和扩展,所以推荐用链式的pipe操作来替代。
修改方案:拆分结果选择器逻辑
把原来第二个参数里的逻辑拆到内部Observable的pipe中,用tap处理副作用(比如调用mark_jobs_unavailable),再用map返回你需要的原始值(job)。同时,RxJS 6里用EMPTY代替Observable.empty(),记得导入它:
import { map, switchMap, tap } from 'rxjs/operators'; import { EMPTY } from 'rxjs'; // 改造后的pipe代码 .pipe( map(job => job[0]), switchMap(job => { if (!job) { return EMPTY; } // 内部Observable后追加tap和map来实现原结果选择器的逻辑 return this.bookingService.findByID(job.property.id).pipe( tap(bookings => this.mark_jobs_unavailable(job, bookings)), map(() => job) // 返回原始的job,和原逻辑一致 ); }) )
这样改造后,代码结构更清晰,也符合RxJS 6的设计规范,警告自然就消失了。
问题2:rxjs-compat下原RxJS 5代码报错“Expected 1 argument but got 2”
这个报错是因为你没有正确导入rxjs-compat提供的兼容版链式操作符。RxJS 6默认只支持pipe式的操作符调用,要使用RxJS 5的链式.switchMap()写法,需要单独导入compat里的对应操作符:
解决步骤:
- 确保你已经安装了
rxjs-compat(你说已经装了,这一步没问题) - 在代码顶部导入compat版的链式操作符:
import 'rxjs-compat/add/operator/map'; import 'rxjs-compat/add/operator/switchMap'; import { Observable } from 'rxjs-compat'; // 或者从rxjs导入,但要确保compat生效 - 这样原RxJS 5的链式代码就能正常运行了:
.map(job => job[0]) .switchMap( (job) => { return job ? this.bookingService.findByID(job.property.id) : Observable.empty(); }, (job: Job, bookings: Booking[]) => { this.mark_jobs_unavailable(job, bookings); return job; } )
不过要注意,rxjs-compat只是过渡方案,最终还是建议完全迁移到RxJS 6的pipe写法,避免后续版本的兼容性问题。
内容的提问来源于stack exchange,提问作者Subhan
相关产品推荐
相关产品推荐

