为什么会有 rxjs 这种库? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
yhvictor
V2EX    Javascript

为什么会有 rxjs 这种库?

  •  1
     
  •   yhvictor 2018-12-27 16:15:03 +08:00 10314 次点击
    这是一个创建于 2560 天前的主题,其中的信息可能已经有所发展或是发生改变。

    别人推荐我看一下 reactiveX,于是看了下,一看 operator 真是不知道多少个: https://www.learnrxjs.io/operators/

    相比较之下,guava concurrency 的 operator 就少得多了(一半以上还是因为重载): https://google.github.io/guava/releases/21.0/api/docs/com/google/common/util/concurrent/Futures.html

    所以,rxjs 这东西有什么好处呢?为什么能火呢? 以及 Javascript 有没有类似 listenable future 的类或者库呢?

    30 条回复    2019-01-24 10:21:35 +08:00
    JesseHeisenberg
        1
    JesseHeisenberg  
       2018-12-27 16:22:10 +08:00
    当你用起来就能感受到丝滑般的流畅,事件流在管理着各种跨模块的状态,给每个单独的模块解耦合,想想就激动。
    lrz0lrz
        2
    lrz0lrz  
       2018-12-27 16:22:24 +08:00 via Android
    1、rxjs 不火
    2、有 rxjs 是因为有 rxjava 等其他语言的 ReactiveX 库
    3、listenable future 是啥?不过 rxjs 的竞品有不少,或许有楼主想要的
    jera
        3
    jera  
       2018-12-27 16:33:21 +08:00
    1. rxjs 不火。
    2. rx 好像起源于 linq 的扩展。
    3. operator 多是因为官方帮你实现了他认为有必要实现的,实质上任何人都可以自己实现 operator 用 Observable#lift 方法挂上去。
    4. 不懂 java,你说的 listenable future 应该是 Observable 或者 Observable 的订阅。
    jera
        4
    jera  
       2018-12-27 16:34:17 +08:00
    对了,你应该对比 RxJAVA 而不是 RxJS。
    jimrok
        5
    jimrok  
       2018-12-27 16:37:09 +08:00
    学习曲线其实挺高的,使用异步事件模式来组织业务逻辑是非常难的,代码也非常难维护。因为业务逻辑非常依赖一个上下文状态,但在流的方式下,上下文的状态数据随着流在处理环节中流动,你只需面对流中的上下文信息就好了。而且单向数据流避免了并发引起的状态混乱。
    akatquas
        6
    akatquas  
       2018-12-27 16:37:45 +08:00 via iPhone
    时间流的思想高的不知道哪里去了
    Yiki
        7
    Yiki  
       2018-12-27 16:39:42 +08:00
    用过一点,懂了一点,觉得学起来蛮吃力是真的
    但好像是挺好用的……
    wly19960911
        8
    wly19960911  
       2018-12-27 16:45:44 +08:00
    @jimrok #5 那我们能不能把数据 copy 一份,然后接受流的处理,之后 return 赋值给 this 的变量,这样的话避免掉使用 this,其实我一直很忌讳使用 this 的变量,或者说直接修改所需要的业务数据。我好奇这种情况适用性广不广?
    zjsxwc
        9
    zjsxwc  
       2018-12-27 17:00:32 +08:00 via Android
    等价于有了微积分 我们为什么要学傅立叶变换
    jimrok
        10
    jimrok  
       2018-12-27 17:51:48 +08:00
    @wly19960911 你说的对,reactive 就是要求数据不变性,函数不能产生副作用,而且要求数据单向流动。你可以想像成在汽车流水线上工作,不是一哄而上的进行修改。
    kutata
        11
    kutata  
       2018-12-27 18:04:50 +08:00 via iPhone
    歪个楼,有人能告诉我 graphQL 是什么吗…?
    youxiachai
        12
    youxiachai  
       2018-12-27 18:08:18 +08:00
    rxjs 什么是火了....
    drydiy
        13
    drydiy  
       2018-12-27 19:06:10 +08:00
    @kutata 别问,学就对了。
    66beta
        14
    66beta  
       2018-12-27 19:08:53 +08:00 via Android
    @kutata 前端不需要后端系列
    PALELESS
        15
    PALELESS  
       2018-12-27 19:16:47 +08:00
    xstream 了解一下 与 cyclejs 配套使用无敌 不过说实话流式编程感觉也就是开拓思维吧 暂时正式项目很少见到 会的人不是很多
    zhwithsweet
        16
    zhwithsweet  
       2018-12-27 19:17:33 +08:00
    1.rxjs 本身是基于可观测,维护一个稳定的数据流,dom 操作,网络 I/O 等等都归结为副作用,有专门的订阅者执行。数据可观测,可控。
    2.rxjs 不火。
    3.有,比如 cycle.js 的底层依赖 xsteam.js 。(本人用过,用来解耦 jsbridge 和 webview 的交互
    mafeifan
        17
    mafeifan  
       2018-12-27 19:31:03 +08:00 via Android
    很多人使用 rxjs 因为用的 angular。在 angular 里很多地方要用到。处理起来也是挺方便的。
    azh7138m
        18
    azh7138m  
       2018-12-27 22:29:35 +08:00 via Android
    @PALELESS 石墨文档好像用的很多

    看上去很好,就是不知道实际使用成本大不大
    grewer
        19
    grewer  
       2018-12-27 22:33:22 +08:00
    其实我感觉不是太需要 如果只是为了使用而去使用 那还是罢了
    先了解一下使用场景 碰到了特殊问题再去考虑吧
    bluzz
        20
    bluzz  
       2018-12-28 02:20:43 +08:00 via Android
    我从 rxjava 开始用的,后来搞 ios 就用 rxswift,重要是思想是一致的,上手就很快
    Perry
        21
    Perry  
       2018-12-28 02:41:34 +08:00
    rxjs 主要靠 Angular 壮大起来的,目前来说还不算火吧。。。
    ljzxloaf
        22
    ljzxloaf  
       2018-12-28 07:12:19 +08:00
    rxjs 不知道,rxjava 就是一种开发范式.由事件和数据驱动业务逻辑,将业务解耦得比较彻底,适合复杂多变的业务场景,当业务发生变化时,改动比较小-------以上是官话.

    我没用过只看过别人的例子,我的理解是简单项目尤其是现在大家都是微服务了,真的用不上这个,如果要用的话也不会直接用,应该结合各自的业务场景再封装一遍,否则开发效率可能要大打折扣.东西是好东西,但是没必要全盘接收.缺点是代码的可读性变差,当然整体上来说更易于理解,逻辑也更清晰了,但是局部代码因为变成了通用逻辑,读起来没那么直观.还有个重要的缺点是调试起来更麻烦了,如果不熟悉的人可能搞不懂它的执行流程.还有涉及到并发 /异步 io/流控什么的时候容易用错. 如果没有接触过这些概念的话有一定的学习成本.

    另外,用不用是一回事,了解一下思想还是有好处的.我就是了解了一下,这不是就装了个 X(
    ChefIsAwesome
        23
    ChefIsAwesome  
       2018-12-28 08:42:07 +08:00 via Android   1
    假设你需要抓 100 个页面,考虑到性能,你的策略是这样的:
    每 5 个页面为一组,因为异步的特性,5 个请求可以同时进行。这 5 个请求完成的时间未知(第 5 个可能在第一个之前完成),你希望收集到数据仍然是按顺序排列的。
    一组请求全部完成之后才进行下一组,直到全部完成。

    这已经是个相当复杂的过程了。实际场景可能更复杂:
    一个请求失败时,自动重试,最多可以试 3 次。
    一组操作完成之后,等 3 秒钟才进行下一组。

    用 rx 的话,上面描述的问题就非常容易解决。
    简单讲,observable 是高级的 promise。当你把异步操作封装成一个可以组合,可以被函数返回的值的时候,很多问题都可以迎刃而解了。
    前端应该碰不到这么复杂的异步问题,好多人看的云里雾里,所以没那么火。
    gzf6
        24
    gzf6  
       2018-12-28 08:50:08 +08:00 via iPhone
    就是异步的一种处理方式,也可以用别的方式,不必拘泥于一种
    sagaxu
        25
    sagaxu  
       2018-12-28 09:21:46 +08:00 via Android
    @ChefIsAwesome 这个例子用 Future 组合写起来也不复杂,用协程就更简单了吧,直接写循环,跟同步阻塞代码一样写。
    lhx2008
        26
    lhx2008  
       2018-12-28 09:25:43 +08:00 via Android
    好像还有 reactorjs,也是 rxjava 那班人写的
    ooeyunarika
        27
    ooeyunarika  
       2018-12-28 09:37:08 +08:00
    reactiveX 这套异步处理思路现在主流语言都有对应的类库,在处理异步问题上得到相同的体验,学会一套就到处受用了,多少会降低一些跨语言异步处理的心智负担

    相比于其他语言尤其是 java,js 的异步处理工具和类库要丰富和成熟很多,所以 rxjs 确实在这当中不算突出,但如楼上大佬们所说,rx 这套工具衍生自 linq,是大量地开发实践后催生出来的更为成熟的异步处理思路.

    至可读性降低那只是因为异步本身就需要考虑那么多复杂的场景,只是之前大部分都被忽略了.尤其是前端,以前大部分用 promise 都只考虑 success 而忽视了 failure 的处理,在前端最多控制台报个错用户刷新一下就恢复了,放在后端就可能是非常致命的 bug.
    asAnotherJack
        28
    asAnotherJack  
       2018-12-28 11:35:50 +08:00
    rxjava 挺火的
    xzk715
        29
    xzk715  
       2018-12-28 15:45:59 +08:00
    说 rx 主要是位了解决异步问题的 一看就不是真了解 rx
    Sapp
        30
    Sapp  
       2019-01-24 10:21:35 +08:00
    rx 其实我是用来做一些数据处理,如果真的数据非常多,非常乱,需要几路并流,然后经过转换输出结果,还是好用的,其他业务没什么必要,不过我还是经常用 xstream,比 rxjs 小,更简单,偶尔用用也够用了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5160 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 03:36 PVG 11:36 LAX 19:36 JFK 22:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86