this artcle によれば、onComplete
のonError
およびsubscribe
関数は相互に排他的です。
onError
またはonComplete
イベントのいずれかが意味するのは、subscribe
で起動します。
エラーが発生したか、情報のSteamを正常に終了したかどうかにかかわらず、実行する必要があるロジックブロックがあります。
pythonのfinally
のようなものを探しましたが、見つかったのは finally
だけで、これは作成するobservableにアタッチする必要があります。
しかし、このロジックを実行したいのは、サブスクライブしたとき、およびストリームが終了した後、成功したかエラーであったかだけです。
何か案は?
この演算子の現在の「pipable」バリアントは、finalize()
と呼ばれます(RxJS 6以降)。古い、現在廃止された「パッチ」演算子はfinally()
と呼ばれていました(RxJS 5.5まで)。
finalize()
演算子は実際に正しいと思います。あなたは言う:
私が購読するとき、そしてストリームが終了した後にのみそのロジックを実行します
これは問題ではないと思います。単一のsource
を使用し、必要に応じてサブスクライブする前にfinalize()
を使用できます。この方法ではalwaysを使用する必要はありませんfinalize()
:
let source = new Observable(observer => {
observer.next(1);
observer.error('error message');
observer.next(3);
observer.complete();
}).pipe(
publish(),
);
source.pipe(
finalize(() => console.log('Finally callback')),
).subscribe(
value => console.log('#1 Next:', value),
error => console.log('#1 Error:', error),
() => console.log('#1 Complete')
);
source.subscribe(
value => console.log('#2 Next:', value),
error => console.log('#2 Error:', error),
() => console.log('#2 Complete')
);
source.connect();
これはコンソールに出力されます:
#1 Next: 1
#2 Next: 1
#1 Error: error message
Finally callback
#2 Error: error message
2019年1月:RxJS 6用に更新
私のために働いた唯一のものはこれです
fetchData()
.subscribe(
(data) => {
//Called when success
},
(error) => {
//Called when error
}
).add(() => {
//Called when operation is complete (both success and error)
});
AngularアプリケーションでRxJS 5.5.7を使用していますが、finalize
演算子を使用すると、成功またはエラーコールバックの前に起動されるため、ユースケースで奇妙な動作をします。
簡単な例:
// Simulate an AJAX callback...
of(null)
.pipe(
delay(2000),
finalize(() => {
// Do some work after complete...
console.log('Finalize method executed before "Data available" (or error thrown)');
})
)
.subscribe(
response => {
console.log('Data available.');
},
err => {
console.error(err);
}
);
サブスクリプションでadd
medhodを使用して、目的を達成する必要がありました。基本的に、成功またはエラーコールバックが行われた後のfinally
コールバック。 try..catch..finally
ブロックまたはPromise.finally
メソッドと同様です。
簡単な例:
// Simulate an AJAX callback...
of(null)
.pipe(
delay(2000)
)
.subscribe(
response => {
console.log('Data available.');
},
err => {
console.error(err);
}
);
.add(() => {
// Do some work after complete...
console.log('At this point the success or error callbacks has been completed.');
});