web-dev-qa-db-ja.com

RxJS finalizeオペレーターが呼び出されていません

すべてのオブザーバブルが実行されたときにコールバックをトリガーしようとしています。私の他の古いプロジェクトでは、finallyをそのように使用し、それは魅力のように機能しました:

this.myService.callDummy()
  .finally(() => console.log('Works!'))
  .subscribe(result => ...)

しかし、今はRxJSの新しいバージョンをPipeable operatorで使用していますが、finally呼び出し(現在はfinalizeに名前が変更されています)は実行されません。見つけるべき情報はほとんどなく、私が何を間違っているのかわかりません。

combineLatest(
  this.route.queryParams,
  this.myService.callDummy1(),
  this.myService.callDummy2()
)
.pipe(finalize(() => console.log('Does not work!')))
.subscribe(results => ...);

どんな助けでもありがたいです。

11
Nico Van Belle

オブザーバブルでは、発砲と完了は同じものではありません。

各項目が値を発行しますが、route.queryParamsは定義上決して完了しません。これは、Angularが非終了オブザーバブルとして実装するためです。手動で完了する必要があります。内部で結合されているすべてのオブザーバブルが完了したときにのみ、combineLatestが完了するため、ファイナライズして実行します。

combineLatest(
  this.route.queryParams.pipe(take(1)), // take(1) will complete the observable after it has emitted one value
  this.myService.callDummy1(),
  this.myService.callDummy2()
)
.pipe(finalize(() => console.log('Does not work!')))
.subscribe(results => ...);

これで完了です。

9
bryan60

結合されたObservablesの1つが実際に完了しますか?どちらかと .completeまたは.error

結合されたObservablesのいずれも完了しない場合、finallyは呼び出されません。

0
ritaj

オブザーバブルが完了したときに何かを実行したい場合は、finally/finalizeの代わりにcompleteコールバックを使用します。

_.subscribe(
    value => { console.log(`Next: ${value}`); },
    error => { console.log(`Error: ${error}`); },
    ()    => { console.log(`Completed`); }
);
_

とにかくfinally/finalizeも機能し、エラー時に呼び出されますOR complete。オブザーバブルが決して完了しないことを確信しています。上記の私のコードを使用してこれを確認できます。

Angularと_this.route.queryParams_をサブスクライブしているため、完了しない)を使用しているようです。first()を使用して新しいオブザーバブルを作成すると、値とすぐに完了します:this.route.queryParams.pipe(first())

0
Mick