RxJS 6 switchMap 弃用符号使用

RxJS 6 switchMap Deprecated Symbol used

我已经从 Angular 5 更新到 Angular 6。现在我正在尝试更新我的代码以使其与 RxJS 6 兼容。

.pipe(
  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;
  })
)

我在使用 Deprecated Symbol is used.

的 switchMap 时收到警告

这些是我的进口商品:import {map, switchMap} from 'rxjs/operators';

有没有其他方法可以在 v6 中使用 switchMap?另外,如果我不更改我的代码,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;
})

Error: Expected 1 argument but got 2.

作为 switchMap 的第二个参数给出的 resultSelector 函数是 deprecated。您需要删除它并使用 map 运算符实现目标。

这里最棘手的部分是决定将 map 运算符放在哪里。实际上,映射运算符进入作为 switchMap 参数提供的函数体内。

没有结果选择器函数的代码如下所示:

     .pipe(
          map(job => job[0]),
          switchMap((job) => {
            return (job ? this.bookingService.findByID(job.property.id) : Observable.empty()).pipe(

              // This is the mapping function provided as the alternative to the deprecated result selector function
              // This should be placed inside the body of the function which is the 1st (and only one) argument of switchMap
              map((bookings: Booking[])=>{
              this.mark_jobs_unavailable(job, bookings);
              return job;
            })

            );
          }     
         )
        )
.pipe(
  map(job => job[0]),
  switchMap((job) => {
    return job ? this.bookingService.findByID(job.property.id).pipe(
      map((bookings: Booking[]) => {
        return {
          job: job,
          bookings: bookings
        };
      })
    ) : Observable.empty();
  }
).subscribe((job, bookings: Booking[]) => {
  ...
})

对于那些像我一样没有立即理解为什么我不能使用这些重载的人:

resultSelector 的重载仍然可以使用,但弃用是对未来更改的警告,因此,它们可以在下一版本的 RxJS 中删除。

像上面那样使用运算符 map