首页 > 其他分享 >rxjs的几点使用心得

rxjs的几点使用心得

时间:2023-04-10 16:12:52浏览次数:30  
标签:console complete error next rxjs 几点 心得 subject

1.对错误的处理

日常使用中,点击按钮需要往后台发消息,为了不重复发消息,经常需要把点击事件做成subject,然后把发消息的过程做成switchMap,类似下面的写法

    const subject = new rxjs.Subject();
    subject.pipe(       rxjs.operators.switchMap(index => {         return rxjs.of(index);       })     ).subscribe({       next: console.log,       error: err => console.error('error2', err),       complete: () => console.log('complete')     });
    subject.next(1);     subject.next(2);     subject.next(3);     subject.next(4);     subject.complete();

但是如果某一个发消息的observer报了一个500错误,那么会导致后面的点击事件不会继续调用发消息的过程。

    const subject = new rxjs.Subject();

    subject.pipe(
      rxjs.operators.switchMap(index => {
        if (index === 2) {
          return rxjs.throwError(new Error('error'));
        }
        return rxjs.of(index);
      })
    ).subscribe({
      next: console.log,
      error: err => console.error('error2', err),
      complete: () => console.log('complete')
    });

    subject.next(1);
    subject.next(2);
    subject.next(3);
    subject.next(4);
    subject.complete();

如上,当index等于2时,rxjs抛出错误,后面的3,4都不会执行了。

为了使后台的错误不影响rxjs,我们需要对switchMap里面的observer做catchError的特殊处理。如下:

    const subject = new rxjs.Subject();

    subject.pipe(
      rxjs.operators.switchMap(index => {
        if (index === 2) {
          return rxjs.throwError(new Error('error')).pipe(
            rxjs.operators.catchError(err => {
              return rxjs.empty();
            })
          );
        }
        return rxjs.of(index);
      })
    ).subscribe({
      next: console.log,
      error: err => console.error('error2', err),
      complete: () => console.log('complete')
    });

    subject.next(1);
    subject.next(2);
    subject.next(3);
    subject.next(4);
    subject.complete();

这样做会跳过抛出错误的后台请求,保证rxjs继续往下执行。

2.如何保证loading = false必执行

如果rxjs抛出错误,subscribe的error分支会执行,complete分支不会执行

如果rxjs不抛出错误结束,subscribe的error分支不会执行,complete分支会执行

有个操作符,不管抛不抛出错误,他都会执行。

    var loading = true;
    rxjs.from([1,2,3]).pipe(
      rxjs.operators.map(i => {
        if (i === 2) {
          throw new Error('error');
        }
        return i;
      }),
      rxjs.operators.finalize(() => {
        console.log('set loading')
        loading = false;
      })
    ).subscribe({
      next: console.log,
      error: console.error,
      complete: () => console.log('complete')
    });

3.如何依次发送后台请求

碰到需要同时发送后台请求时,一般使用forkjoin方法。

如果请求A依赖于请求B的结果,需要A返回后再发送请求B。这时可以用concat配合bufferCount操作符来实现

    var a = rxjs.Observable.create((observer) => {
      setTimeout(() => observer.next('a1'), 2000);

      // setTimeout(() => observer.error(new Error('error')), 3000);
      setTimeout(() => observer.complete(), 4000);
    });

    var b = rxjs.Observable.create((observer) => {
      setTimeout(() => observer.next('b1'), 2000);
      // setTimeout(() => observer.next('b2'), 3000);
      // setTimeout(() => observer.next('b3'), 3300);
      setTimeout(() => observer.complete(), 4000);
    });

    rxjs.concat(a, b).pipe(
      rxjs.operators.bufferCount(2),
    ).subscribe({
      next: console.log,
      error: err => console.error('error123', err),
      complete: () => console.log('complete')
    });

 

标签:console,complete,error,next,rxjs,几点,心得,subject
From: https://www.cnblogs.com/chen8840/p/17303241.html

相关文章

  • 心得两则
    守规矩的人我们喜欢,会变通的人我们也想要作为一个TL期望下属按照自己制定的规则去执行,又期望下属在处理事情的时候能够灵活变通。到底是要不要变通呢?看上去矛盾了吧!其实二者并不会相互矛盾,本质上就是上级想要的就是在对的时候做对的事的人。但在下级出错的时候往往会向下级强调......
  • 2023年4月8日leetcode练习心得
    给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。 来源:力扣(LeetCode)链接:https://leetcode.cn/problems/sing......
  • 软件工程日报——团队合作小心得
    在经过两天的休息之后,我们团队终于准备要继续进行项目的编写,准备合作完成这个排班系统。想法很美好,现实很骨感,我们小组在完成前端框架之后不知道接下来的方向在哪,不知道如何具体分工,这可让我犯了难题。作为队长,我简单思考了一下我们队接下来的方向,主要分为三个方向:后端编写、前......
  • 项目需求和客户交流的心得体会
      从毕业到现在,做过好几个不同的项目,不想谈论技术相关的话题,我更多的是谈论与客户的交流和沟通。  众所周知,客户往往都是不懂系统开发技术的客户群体。所以,对于需求管理人员,既要弄懂客户所描述的系统功能,还要用最通俗的语言,将自己所理解的需求告知客户,待双方达成一致,方可算......
  • 【心得】Man at Work3--猎人的青春!
    【心得】ManatWork3--猎人的青春! 这是我接触到的第1款3DGAL游戏。里面的5个女孩子:“贾斯丁”,“菲利丝”,“凌小路瑞惠”,“莫妮卡”以及“莉莎”在我没怎么看攻略的情况下,就凭借着一腔热血以及永不消逝的耐心,终于一一攻破了...值得我骄傲的是,我并没有在离“热恋”差1的情况下,存......
  • NestJS 拦截器 和 RxJs
    为什么要介绍RxJs因为在Nestjs已经内置了RxJs无需安装并且Nestjs也会有一些基于Rxjs提供的APIRxJs是什么RxJs使用的是观察者模式,用来编写异步队列和事件处理。Observable可观察的物件Subscription监听ObservableOperators纯函数可以处理管道的数据如mapfil......
  • RxJS 系列 – Mathematical and Aggregate Operators
    前言前几篇介绍过了 CreationOperatorsFilteringOperatorsJoinCreationOperatorsErrorHandlingOperatorsTransformationOperatorsJoinOperatorsUtilityOperatorsConditionalandBooleanOperators这篇继续介绍 MathematicalandAggregateOperators 参......
  • RxJS 系列 – Conditional and Boolean Operators
    前言前几篇介绍过了 CreationOperatorsFilteringOperatorsJoinCreationOperatorsErrorHandlingOperatorsTransformationOperatorsJoinOperatorsUtilityOperators这篇继续介绍 ConditionalandBooleanOperators 参考Docs– ConditionalandBooleanOp......
  • RxJS 系列 – Utility Operators
    前言前几篇介绍过了 CreationOperatorsFilteringOperatorsJoinCreationOperatorsErrorHandlingOperatorsTransformationOperatorsJoinOperators这篇继续介绍 UtilityOperators 参考Docs–UtilityOperators  Tap ......
  • rxjs
     安装1. web:  https://unpkg.com/[email protected]/dist/cjs/index.js2.npm: npminstallrxjs  因为rxjs本身就是ts写的,所以没有@types/rxjs 这个类型文件。github仓库: https://github.com/ReactiveX/rxjs码云: https://gitee.com/mirrors/rxjs?_from=gitee_search......