仅当可观察者尚未完成时才取消订阅

时间:2019-12-10 00:39:59

标签: rxjs rxjs6

我有一个可观察对象,当订户取消订阅时,我想为其调用取消(拆卸)逻辑,但前提是源可观察对象本身尚未完成(或失败)。

内置的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));

是否有任何更简洁的方法可以使用任何内置基元来实现相同目的?

0 个答案:

没有答案