web-dev-qa-db-ja.com

RxJS 6 switchMap非推奨のシンボルを使用

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

8
Subhan Ahmed

switchMapの2番目の引数として指定されたresultSelector関数は 非推奨 です。これを削除し、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;
            })

            );
          }     
         )
        )
9
siva636
.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[]) => {
  ...
})
1
Eduardo