我有一个可观察对象,当订户取消订阅时,我想为其调用取消(拆卸)逻辑,但前提是源可观察对象本身尚未完成(或失败)。
内置的finalize
运算符可以在发生unsubscribe
时注册自定义回调,但是每当取消订阅是由订户或可观察到的源引起时,就会调用它。
我实现了此辅助功能:
function withCancellation(source, onCancel) {
return new Observable(subscriber => {
let completed = false;
const cancellable = source.pipe(
tap({
error: () => { completed = true; },
complete: () => { completed = true; },
})
);
const subscription = cancellable.subscribe(subscriber);
subscription.add(() => { if (!completed) onCancel(); });
return subscription;
});
}
我可以使用以下方式:
const sourceStream = startJob(jobId); // returns source observable
const cancellableStream = withCancellation(sourceStream, () => stopJob(jobId));
是否有任何更简洁的方法可以使用任何内置基元来实现相同目的?