当前位置: 首页 > news >正文

React 项目运用 RxJS 设置节流

RxJS 核心概念

一小时入门RxJS,中文教学放心适用,讲解非常棒

按钮组:

<buttonnz-buttonnzType="primary"style="cursor:pointer!important;margin-bottom:4px;"(click)="throttleClick(flag1, 2000, btnFunc1)">btn1</button><buttonnz-buttonnzType="primary"style="cursor:pointer!important;margin-bottom:4px;"(click)="throttleClick(flag2, 2000, btnFunc2)">btn2</button>

引用 rxjs :

import{Subject,forkJoin,Observable,of}from'rxjs';// 引入 forkJoinimport{throttleTime,takeUntil,catchError,tap,map}from'rxjs/operators';

按钮触发事件:

// 点击 btn1 按钮触发的事件btnFunc1():Observable<any>{}// 点击 btn2 按钮触发的事件btnFunc1():Observable<any>{}

设置节流:

  • takeUntil
    函数签名:takeUntil(notifier: Observable): Observable
    发出值,直到提供的 observable 发出值,它便完成。

  • throttleTime
    函数签名:throttleTime(duration: number, scheduler: Scheduler): Observable
    当指定的持续时间经过后发出最新值。

  • call()是函数的原生方法,作用是立即执行该函数,并强制绑定函数内部的this指向第一个参数,后续参数作为函数的入参传入。

  • bind()是 JavaScript 函数的原生方法,核心作用是创建一个新函数,这个新函数被调用时,其内部的this会永久绑定到 bind() 的第一个参数,同时可以预先传入部分参数(柯里化)

throttleClick(btnKey:string,delay:number,callback:()=>void):void{// 若该按钮未创建 Subject,初始化并设置节流if(!this.buttonSubjects.has(btnKey)){constsubject$=newSubject<void>();subject$.pipe(throttleTime(delay),// 节流核心takeUntil(this.destroy$)// 组件销毁时取消订阅).subscribe(function(){callback.call(this)}.bind(this));// 执行按钮回调this.buttonSubjects.set(btnKey,subject$);}// 发送点击信号this.buttonSubjects.get(btnKey)&&this.buttonSubjects.get(btnKey).next();}

完整 js 代码

import{Subject,forkJoin,Observable,of}from'rxjs';// 引入 forkJoinimport{throttleTime,takeUntil,catchError,tap,map}from'rxjs/operators';// 存储每个按钮的 Subject(key=按钮标识,value=对应 Subject)privatebuttonSubjects=newMap<string,Subject<void>>();// 组件销毁信号privatedestroy$=newSubject<void>();throttleClick(btnKey:string,delay:number,callback:()=>void):void{// 若该按钮未创建 Subject,初始化并设置节流if(!this.buttonSubjects.has(btnKey)){constsubject$=newSubject<void>();subject$.pipe(throttleTime(delay),// 节流核心takeUntil(this.destroy$)// 组件销毁时取消订阅).subscribe(function(){callback.call(this)}.bind(this));// 执行按钮回调this.buttonSubjects.set(btnKey,subject$);}// 发送点击信号this.buttonSubjects.get(btnKey)&&this.buttonSubjects.get(btnKey).next();}// 点击 btn1 按钮触发的事件btnFunc1():Observable<any>{}// 点击 btn2 按钮触发的事件btnFunc1():Observable<any>{}ngOnDestroy(){this.destroy$.next();this.destroy$.complete();// 遍历销毁所有按钮的 Subjectthis.buttonSubjects.forEach(subject$=>subject$.complete());this.buttonSubjects.clear();}
http://www.jsqmd.com/news/463241/

相关文章:

  • 【嵌入式Linux】应用开发基础总结
  • 别再找Python+YOLO教程了!Java+YOLOv11保姆级教程:环境搭建→模型加载→推理全流程,附我踩过的5个血泪坑
  • 保姆级网络安全入门教程:手把手带你从小白进阶大神(附学习资源)
  • OpenClaw机器人引爆天网,首次拥有记忆,逆天了!
  • Java毕业设计-基于springboot框架的医院预约挂号系统项目实战(附源码+论文)
  • 运维岗干久了会怎么样?为什么说运维工程师做不长久,做两年就赶快转转岗?
  • 【大数据存储与管理】分布式数据库HBase:02 HBase访问接口
  • 短剧SAAS系统 vs 私有化部署:内容方/创业者该如何选择?
  • 〘 3-2 〙软考高项 | 第10章:项目进度管理(下)
  • 非科班转网络安全完整指南:没有天赋,只有系统方法,年薪50万+实战路径
  • 网络安全自学路线图:从0基础到实战专家,这一篇就够了!(超详细)
  • 【算法二十】 1​​​​​​​1​​​​​​​4. 寻找两个正序数组的中位数 153. 寻找旋转排序数组中的最小值
  • 机器学习(一)-数学基础
  • JAVA学习
  • Java基础——类和对象
  • HoRain云--BIOS快速检查硬盘识别全攻略
  • 腾讯云部署 OpenClaw:云服务器真的需要图形界面(GUI)吗?顶级工程师的深度复盘
  • 企业级BI选型终极指南:2026年五大平台深度横评与关键决策指标
  • Winscope高级疑问“Invisible due to”是如何来的呢?
  • HoRain云--Python爬虫必看:NoneType错误终极解决指南
  • 3种方法:如何将PPT文件变成PPS放映格式
  • 多租户数据隔离实战:衡石科技如何保障企业级SaaS服务的数据安全?
  • 论文人狂喜!Paperxie 界面深度拆解:毕业论文初稿 + 绘图 + 排版 + AI 率,一个页面全搞定
  • HoRain云--MySQL锁机制:高并发与数据安全艺术
  • 论文写作新范式:Paperzz 如何破解毕业论文初稿、绘图、排版与 AI 率四大难题
  • 【游戏设计】潜行游戏
  • 2026 毕业论文破局指南:Paperzz 一站式搞定初稿、绘图、排版与 AI 率,告别毕业季焦虑
  • 消费增值:商业新赛道上绿色积分的“王者”
  • ssm+java2026年毕设商场后台管理系统【源码+论文】
  • 拒绝 API 堆砌:当“AI 龙虾”打破传统软件工程的确定性边界