すべてのオブザーバブルが実行されたときにコールバックをトリガーしようとしています。私の他の古いプロジェクトでは、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 => ...);
どんな助けでもありがたいです。
オブザーバブルでは、発砲と完了は同じものではありません。
各項目が値を発行しますが、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 => ...);
これで完了です。
結合されたObservable
sの1つが実際に完了しますか?どちらかと .complete
または.error
?
結合されたObservable
sのいずれも完了しない場合、finally
は呼び出されません。
オブザーバブルが完了したときに何かを実行したい場合は、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())