什么样的代码才更可读?RxJS实现“搜索”功能

简介: 什么样的代码才更可读?RxJS实现“搜索”功能

闲言少叙,直接开冲!


先用 JS 原生写一个搜索功能:


<input id="text"></input>
<script>
    var text = document.querySelector('#text');
    text.addEventListener('keyup', (e) =>{
        var searchText = e.target.value;
        $.ajax({ // 发送请求
            url: `search.qq.com/${searchText}`,
            success: data => {
              render(data); // 处理数据
            }
        });
    });
</script>


搜索都是要做防抖处理的,简易版防抖如下:

<input id="text"></input>
<script>
    var text = document.querySelector('#text'),
        timer = null;
    text.addEventListener('keyup', (e) =>{
        clearTimeout(timer); // 频繁触发则会清除上一定时器
        timer = setTimeout(() => {
            console.log('发起请求..');
        },300) // 300 后毫秒触发;
    })
</script>


所以,搜索功能演变为:

<input id="text"></input>
<script>
    var text = document.querySelector('#text'),
        timer = null,
        currentSearch = '';
    text.addEventListener('keyup', (e) =>{
        clearTimeout(timer)
        timer = setTimeout(() => {
            var searchText = e.target.value;
            $.ajax({
                url: `search.qq.com/${searchText}`,
                success: data => {
                    render(data);
                }           
            });
        },300)
    })
</script>


对吧,很常规。但是实际上的业务往往会远大于示例中的代码,按照上面的思路,最终会写成这种玩意儿:

image.png一点不夸张。

这个时候,只能献祭出终极解决方案:本篇主角 —— RxJS 了,其实不止有 JS 的 RxJS,与之对应的还有,RxJava、RxAndroid、RxSwift,它们都是处理异步编程的【核武器库】;


RxJS 实现:

import { fromEvent } from 'rxjs';
import { debounceTime, pluck, switchMap } from 'rxjs/operators';
var text = document.querySelector('#text');
var inputStream = Rx.Observable.fromEvent(text, 'keyup')
                    .debounceTime(300)
                    .pluck('target', 'value')
                    .switchMap(url => Http.get(url))
                    .subscribe(data => render(data));


让我们来一一解析它的 API:

  • fromEvent


fromEvent 用于将事件转换成 observable 序列(若还不理解什么是 observable 的同学,可以简单理解它为一个加强版本的 Promise);

总之,创建点击时间的 observable 都这样写:

const source = fromEvent(document, 'click');

  • debounceTime


这个好理解,对事件加防抖的,参数就是防抖时间;

官方解释就是:舍弃掉在两次输出之间小于指定时间的发出值;

u1s1,这解释读起来很费劲。。(若还不理解什么是防抖的同学,可以将它理解为 LOL 中的回程,按下 B 键,隔了几秒,才会真正回城回血,如果一直按 B ,则一直不会回城);


  • pluck

选择属性来发出;


比如:

const source = from([{ name: 'Joe', age: 30 }, { name: 'Sarah', age: 35 }]);
// 提取 name 属性
const example = source.pipe(pluck('name'));
// 输出: "Joe", "Sarah"
const subscribe = example.subscribe(val => console.log(val));


在搜索的例子中,则是提取点击的 event.target.value


  • switchMap

switchMap 要重点理解下;

官方解释是:映射成 observable,完成前一个内部 observable,发出值。

没错,依然不好懂 ZZZ

不如,换个角度来解释:

RxJS 中通常用【弹珠图】来表示“事件流”,比如 map api 的弹珠图如下:

image.png


switch api 的弹珠图如下:

image.png


当发出一个新的内部 Observable 时, switch 会从先前发送的内部 Observable 那取消订阅,然后订阅新的内部 Observable 并开始发出它的值。

即永远订阅最新的Observable;


那么:switchMap = map + switch ,示意如下:

image.png


结合理解,在本篇搜索示例中,即用 Http.get(url) 所得 data 值作为事件流的最新值,进行后续的传递;

至此,我们可以得出:RxJS 让代码变得十分简洁、可读,前提是,我们熟悉事件流这个东西,熟悉它的 API~~


OK,以上便是本篇分享,希望对你能有所帮助~觉得不错,给个三连吧 👍👍👍


相关文章
|
9月前
|
弹性计算 编解码 程序员
阿里云服务器又大降价了!2核2G配置云服务器测评及阿里云服务器活动内容揭秘
阿里云服务器又大降价了!2核2G配置云服务器测评及阿里云服务器活动内容揭秘!对于资深程序员来说,服务器的配置和价格都是选择的关键因素。而阿里云的2核2G3M轻量应用服务器,正是一款性价比极高的选择。阿里云针对新用户推出了前所未有的优惠活动。具体来说,新用户购买这款2核2G3M轻量应用服务器,可以享受秒杀的优惠,年付价格仅需61元。这样的价格,对于许多初入云计算领域的新手来说,无疑是一个极具吸引力的优惠。那么,这款2核2G3M轻量应用服务器到底具备怎样的性能呢?从配置来看,它拥有2个核心CPU、2GB内存以及3Mbps的带宽。这样的配置,对于大多数个人网站、小型企业应用来说已经足够满足需求。
|
3月前
|
人工智能 IDE API
AI Agent 框架实战横评:通义灵码、OpenClaw、Hermes 三框架深度对比
AI Agent(智能体)是 2026 年最火的技术方向,但面对众多框架开发者往往无从选择。本文从真实项目需求出发,深度对比阿里云生态三大 Agent 框架——通义灵码(IDE 内智能体)、OpenClaw(开源 Agent 框架)、Hermes Agent(轻量级 Agent 平台),从架构设计、MCP 集成、Vibe Coding、部署方式、成本五个维度进行实战评测,并给出不同场景的选型建议。
|
5月前
|
搜索推荐 安全 BI
网站建设的12个关键要素:从定位到转化,帮你少走弯路
本文拆解网站建设 12 大核心要素,从定位、结构、内容到 SEO、转化与运维,强调以用户为中心,配合成熟 CMS 可高效打造实用且能转化的优质站点。
541 5
|
前端开发 Java 数据安全/隐私保护
深入理解 Spring MVC Controller —— 请求参数获取
前言 接上篇《深入理解 Spring MVC Controller —— 请求映射》,上篇主要介绍了处理器方法及请求映射的定义。有了处理器方法 Spring MVC 就可以对请求进行处理,有了请求映射 Spring MVC 就能知道哪些请求应该由哪些处理器方法来处理。
1656 0
深入理解 Spring MVC Controller —— 请求参数获取
|
2月前
|
存储 人工智能 安全
企业AI知识库未来发展趋势深度解读
本文深度解析2025年企业AI知识库十大趋势:RAG技术迭代升级、全文内容级搜索普及、知识图谱构建立体网络;多云混合存储、跨平台统一数据层、新私有化部署成架构主流;全生命周期管理、物理级数据隔离、文件溯源与任务绑定推动管理变革;知识库正从成本中心跃升为效率、决策、传承与创新的价值引擎。(239字)
295 0
|
2月前
|
缓存 人工智能 自然语言处理
成本直降50%!GPT-5.6 Terra与GPT-5.5跑分、延迟、稳定性深度实测
随着大模型技术持续迭代更新,高效能、低成本成为企业开发、个人项目落地的核心诉求。OpenAI推出的GPT-5.6系列模型,针对性优化了前代模型的成本高、资源消耗大、推理延迟波动等痛点,其中**GPT-5.6 Terra**作为中端均衡主力模型,主打平替GPT-5.5、成本减半的核心优势,一经推出便成为各类AI应用、智能问答、代码开发、文本处理场景的首选模型。
475 1
|
5月前
|
编解码 人工智能 API
HappyHorse(快乐小马)介绍指南:150亿参数量、Transformer单流架构,生成视频定价最低0.9元/秒
HappyHorse(快乐小马)是阿里ATH创新事业部研发的原生多模态AI视频生成大模型,2026年4月登顶全球Video Arena双榜。采用40层单流Transformer架构,首创音画联合生成技术,15B参数,支持1080P/3–15秒视频生成,单H100卡38秒出片,中文理解与人物一致性突出,已通过阿里云百炼、官网及千问App开放灰度测试。
4592 8
|
2月前
|
JSON 前端开发 测试技术
计算巢支持一键部署GLM-5.2
GLM-5.2是智谱推出的旗舰级MoE大模型(744B总参,激活仅40B),支持真正无损1M上下文与128K输出,长程任务能力开源SOTA,编程与工程规范遵循能力卓越,原生支持结构化输出与工具调用,已在计算巢模型市场开放FP8版一键部署。
|
3月前
|
前端开发 数据可视化 API
安诊儿AntAngelMed医学模型落地:基于SKILL架构构建糖尿病高血压智能咨询助手.137
本系统是基于SKILL技能架构的糖尿病+高血压双慢病管理智能体,整合AntAngelMed医学大模型与模块化技能体系(如血糖评估、血压解读、饮食指导、风险预警),支持实时交互、动态扩展与精准咨询,专为患者、社区医护及家庭健康管理者设计。
281 0
|
6月前
|
人工智能 搜索推荐 安全
生成式人工智能驱动下的诈骗范式转移与防御机制研究
本文剖析生成式AI驱动的新型网络诈骗趋势:钓鱼投诉激增85.6%,损失翻倍,攻击转向网络为主、多模态伪造。文章解构LLM钓鱼邮件生成与语音克隆技术,指出传统防御失效,并提出语义校验、多模态活体检测与动态信任链等主动防御架构。(239字)
424 11

热门文章

最新文章