当我在 rxjs 管道中出错时如何取消订阅?

How to do `unsubscribe` when I got error in the pipeline of rxjs?

当我在管道中遇到错误时unsubscribe怎么办?

我在 doWork 函数之外订阅了 subjectPipe 管道。

doWork 函数中我抛出了一个错误(可以作为我的逻辑流程的一部分)。

一切都按预期工作,但 subjectPipe 是日志:“主题错误”,因为我使用 take(1) 我认为它应该取消订阅,但它不会发生,因为完整的功能没有被调用.

发生错误时如何unsubscribe

我唯一能想到的就是创建变量 error$ 并使用 takeUntil 然后在错误函数上调用 error$。但我不想这样做,因为它是额外的变量,如果我对每种情况都这样做,代码会很乱。

stackblitz.com

import { Subject, throwError } from 'rxjs';
import { map, switchMap, take, tap } from 'rxjs/operators';

console.clear();

const doWork = () => {
  const subject = new Subject();

  const work = () => {
    throw new Error('bla');
  };

  const subjectPipe = subject.pipe(
    tap(() => {
      console.log('in subject pipeline');
    }),
    switchMap(() => work())
  );

  subjectPipe.subscribe({
    next: () => console.log('in subjectPipe next'),
    error: () => console.log('in subjectPipe error'),
    complete: () => console.log('in subjectPipe complete'),
  });

  return { subject, subjectPipe };
};

const { subject, subjectPipe } = doWork();

subjectPipe
  .pipe(
    take(1),
    tap(() => console.log('continue the pipe...'))
  )
  .subscribe({
    next: () => console.log('in subject next'),
    error: () => console.log('in subject error'),
    complete: () => console.log('in subject complete'),
  });

subject.next(null);

错误意味着完成(但是,与 complete 关联的回调永远不会被调用)。因此,此处无需手动从流中 unsubscribe

在你的情况下,如果你需要在完成和错误中调用一些逻辑,你可以使用 RxJS finalize 运算符,它会在两种情况下调用。

subjectPipe
  .pipe(
    take(1),
    tap(() => console.log('continue the pipe...')),
    finalize(() =>
      console.log(
        'You can do the final stuff here, instead of `complete` callback'
      )
    )
  )
  .subscribe({
    next: () => console.log('in subject next'),
    error: () => console.log('in subject error'),
    complete: () => console.log('in subject complete'),
  });