• 异步复杂度要到什么程度才需要用到Rxjs?


    异步复杂度要到什么程度才需要用到Rxjs?

     

    如题,虽然大家一直都说rxjs是解决异步的利器,但一直以来无法判断怎么样的程度的异步复杂度才需要用到rxjs(或者需要数据流合并大于不合并的优势的例子)……求举点实际的复杂的例子…实在找不到这样的临界点……

     

    基于 RxJS 构建稳健前端应用
    11 万播放 · 142 赞同
     

    To B 业务的生命周期与迭代通常会持续多年,随着产品的迭代与演进,以接口调用为核心的前后端关系会变得非常复杂。在多年迭代后,接口的任何一处修改都可能给产品带来难以预计的问题。在这种情况下,构建更稳健的前端应用,保证前端在长期迭代下的稳健与可拓展性就变得非常重要。

    RxJS 可以作为整个前端的防腐层的构建方案,用于屏蔽底层接口对于前端业务层的影响。

    编辑于 2021-12-25 21:28· 9.1 万次播放
     

    更多回答

     
     

    比如你写一个基于 websocket 的在线聊天室,不可能每次 ws 收到新消息,都立刻渲染出来,这样在很多人同时说话的时候,一般会有渲染性能问题。

    所以你需要收集一段时间的消息,然后把它们一起渲染出来,例如每一秒批量渲染一次。

    用原生 JS 写的话,你需要维护一个队列池,和一个定时器,收到消息,先放进队列池,然后定时器负责把消息渲染出来,类似:

    let messagePool = []
    ws.on('message', (message) => {
        messagePool.push(message)
    })
    
    setInterval(() => {
        render(messagePool)
        messagePool = []
    }, 1000)
    

    这里已经是最简化的代码了,但逻辑依然很破碎,并且还要考虑清理定时器的问题。

    如果用 RxJS,代码就好看了很多:

    Rx.Observable
        .fromEvent(ws, 'message')
        .bufferTime(1000)
        .subscribe(messages => render(messages))
    

    另外一个例子,比如我们在写一个游戏,当用户连续输入"上上下下左右左右BABA"的时候,就弹出隐藏的彩蛋,用原生 JS 的话也是需要维护一个队列,队列中放入最近12次用户的输入。然后每次按键的时候,都识别是否触发了彩蛋。

    RxJS 的话就简化了很多,主要是少了维护队列的逻辑:

    const code = [
       "ArrowUp",
       "ArrowUp",
       "ArrowDown",
       "ArrowDown",
       "ArrowLeft",
       "ArrowRight",
       "ArrowLeft",
       "ArrowRight",
       "KeyB",
       "KeyA",
       "KeyB",
       "KeyA"
    ]
    
    Rx.Observable.fromEvent(document, 'keyup')
        .map(e => e.code)
        .bufferCount(12, 1)
        .subscribe(last12key => {
            if (_.isEqual(last12key, code)) {
                console.log('隐藏的彩蛋 \(^o^)/~')
            }
        })
    

    当然 RxJS 还可以复杂得多的逻辑,比如要求只有在两秒内连续输入秘籍,才能触发彩蛋,这里该怎么写,留作思考题 (如果你能写出来,说明你已经熟练掌握 RxJS 了)

  • 相关阅读:
    postgresql导入及导出
    高效构建Web应用 教你玩转Play框架 http://www.anool.net/?p=577
    强制远程桌面
    js对日期操作 获取两个日期的相差是否在几月之内
    ACM 擅长排列的小明
    路由vue-router
    小村系列之十五:倒了(修订版)
    小村系列之十三:次贷危机
    小村系列之十:民族主义的兴衰
    小村系列之八:村长开会
  • 原文地址:https://www.cnblogs.com/sexintercourse/p/16256746.html
Copyright © 2020-2023  润新知