当我在管道中遇到错误时,怎么做unsubscribe

我确实订阅了doWork函数外的subjectPipe管道.

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

一切正常,但subjectPipe是log:"in subject error",因为我使用take(1),所以我认为应该取消订阅,但它没有发生,因为完整的函数不是invoke.

当错误发生时,如何使其达到unsubscribe

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

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'),
  });

Javascript相关问答推荐

为什么getRecord()会因为与_logger相关的错误而失败?(使用Hedera SDK)

Vega中的模运算符

如何最好地从TypScript中的enum获取值

在React中获取数据后,如何避免不必要的组件闪现1秒?

Chart.js V4切换图表中的每个条,同时每个条下有不同的标签.怎么做?

当试图显示小部件时,使用者会出现JavaScript错误.

如何让npx在windows中运行js脚本?

屏幕右侧屏障上的产卵点""

我创建了一个创建对象的函数,我希望从该函数创建的对象具有唯一的键.我怎么能做到这一点?

如何将多维数组插入到另一个多维数组中?

400 bad request error posting through node-fetch

覆盖加载器页面避免对页面上的元素进行操作

未加载css colored颜色 ,无法将div设置为可见和不可见

使用插件构建包含chart.js提供程序的Angular 库?

当代码另有说明时,随机放置的圆圈有时会从画布上消失

是否可以将Select()和Sample()与Mongoose结合使用?

FireBase云函数-函数外部的ENV变量

处理app.param()中的多个参数

重新呈现-react -筛选数据过多

固定动态、self 调整的优先级队列