
别人推荐我看一下 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 的类或者库呢?
1 JesseHeisenberg 2018-12-27 16:22:10 +08:00 当你用起来就能感受到丝滑般的流畅,事件流在管理着各种跨模块的状态,给每个单独的模块解耦合,想想就激动。 |
2 lrz0lrz 2018-12-27 16:22:24 +08:00 via Android 1、rxjs 不火 2、有 rxjs 是因为有 rxjava 等其他语言的 ReactiveX 库 3、listenable future 是啥?不过 rxjs 的竞品有不少,或许有楼主想要的 |
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 的订阅。 |
4 jera 2018-12-27 16:34:17 +08:00 对了,你应该对比 RxJAVA 而不是 RxJS。 |
5 jimrok 2018-12-27 16:37:09 +08:00 学习曲线其实挺高的,使用异步事件模式来组织业务逻辑是非常难的,代码也非常难维护。因为业务逻辑非常依赖一个上下文状态,但在流的方式下,上下文的状态数据随着流在处理环节中流动,你只需面对流中的上下文信息就好了。而且单向数据流避免了并发引起的状态混乱。 |
6 akatquas 2018-12-27 16:37:45 +08:00 via iPhone 时间流的思想高的不知道哪里去了 |
7 Yiki 2018-12-27 16:39:42 +08:00 用过一点,懂了一点,觉得学起来蛮吃力是真的 但好像是挺好用的…… |
8 wly19960911 2018-12-27 16:45:44 +08:00 @jimrok #5 那我们能不能把数据 copy 一份,然后接受流的处理,之后 return 赋值给 this 的变量,这样的话避免掉使用 this,其实我一直很忌讳使用 this 的变量,或者说直接修改所需要的业务数据。我好奇这种情况适用性广不广? |
9 zjsxwc 2018-12-27 17:00:32 +08:00 via Android 等价于有了微积分 我们为什么要学傅立叶变换 |
10 jimrok 2018-12-27 17:51:48 +08:00 @wly19960911 你说的对,reactive 就是要求数据不变性,函数不能产生副作用,而且要求数据单向流动。你可以想像成在汽车流水线上工作,不是一哄而上的进行修改。 |
11 kutata 2018-12-27 18:04:50 +08:00 via iPhone 歪个楼,有人能告诉我 graphQL 是什么吗…? |
12 youxiachai 2018-12-27 18:08:18 +08:00 rxjs 什么是火了.... |
15 PALELESS 2018-12-27 19:16:47 +08:00 xstream 了解一下 与 cyclejs 配套使用无敌 不过说实话流式编程感觉也就是开拓思维吧 暂时正式项目很少见到 会的人不是很多 |
16 zhwithsweet 2018-12-27 19:17:33 +08:00 1.rxjs 本身是基于可观测,维护一个稳定的数据流,dom 操作,网络 I/O 等等都归结为副作用,有专门的订阅者执行。数据可观测,可控。 2.rxjs 不火。 3.有,比如 cycle.js 的底层依赖 xsteam.js 。(本人用过,用来解耦 jsbridge 和 webview 的交互 |
17 mafeifan 2018-12-27 19:31:03 +08:00 via Android 很多人使用 rxjs 因为用的 angular。在 angular 里很多地方要用到。处理起来也是挺方便的。 |
19 grewer 2018-12-27 22:33:22 +08:00 其实我感觉不是太需要 如果只是为了使用而去使用 那还是罢了 先了解一下使用场景 碰到了特殊问题再去考虑吧 |
20 bluzz 2018-12-28 02:20:43 +08:00 via Android 我从 rxjava 开始用的,后来搞 ios 就用 rxswift,重要是思想是一致的,上手就很快 |
21 Perry 2018-12-28 02:41:34 +08:00 rxjs 主要靠 Angular 壮大起来的,目前来说还不算火吧。。。 |
22 ljzxloaf 2018-12-28 07:12:19 +08:00 rxjs 不知道,rxjava 就是一种开发范式.由事件和数据驱动业务逻辑,将业务解耦得比较彻底,适合复杂多变的业务场景,当业务发生变化时,改动比较小-------以上是官话. 我没用过只看过别人的例子,我的理解是简单项目尤其是现在大家都是微服务了,真的用不上这个,如果要用的话也不会直接用,应该结合各自的业务场景再封装一遍,否则开发效率可能要大打折扣.东西是好东西,但是没必要全盘接收.缺点是代码的可读性变差,当然整体上来说更易于理解,逻辑也更清晰了,但是局部代码因为变成了通用逻辑,读起来没那么直观.还有个重要的缺点是调试起来更麻烦了,如果不熟悉的人可能搞不懂它的执行流程.还有涉及到并发 /异步 io/流控什么的时候容易用错. 如果没有接触过这些概念的话有一定的学习成本. 另外,用不用是一回事,了解一下思想还是有好处的.我就是了解了一下,这不是就装了个 X( |
23 ChefIsAwesome 2018-12-28 08:42:07 +08:00 via Android 假设你需要抓 100 个页面,考虑到性能,你的策略是这样的: 每 5 个页面为一组,因为异步的特性,5 个请求可以同时进行。这 5 个请求完成的时间未知(第 5 个可能在第一个之前完成),你希望收集到数据仍然是按顺序排列的。 一组请求全部完成之后才进行下一组,直到全部完成。 这已经是个相当复杂的过程了。实际场景可能更复杂: 一个请求失败时,自动重试,最多可以试 3 次。 一组操作完成之后,等 3 秒钟才进行下一组。 用 rx 的话,上面描述的问题就非常容易解决。 简单讲,observable 是高级的 promise。当你把异步操作封装成一个可以组合,可以被函数返回的值的时候,很多问题都可以迎刃而解了。 前端应该碰不到这么复杂的异步问题,好多人看的云里雾里,所以没那么火。 |
24 gzf6 2018-12-28 08:50:08 +08:00 via iPhone 就是异步的一种处理方式,也可以用别的方式,不必拘泥于一种 |
25 sagaxu 2018-12-28 09:21:46 +08:00 via Android @ChefIsAwesome 这个例子用 Future 组合写起来也不复杂,用协程就更简单了吧,直接写循环,跟同步阻塞代码一样写。 |
26 lhx2008 2018-12-28 09:25:43 +08:00 via Android 好像还有 reactorjs,也是 rxjava 那班人写的 |
27 ooeyunarika 2018-12-28 09:37:08 +08:00 reactiveX 这套异步处理思路现在主流语言都有对应的类库,在处理异步问题上得到相同的体验,学会一套就到处受用了,多少会降低一些跨语言异步处理的心智负担 相比于其他语言尤其是 java,js 的异步处理工具和类库要丰富和成熟很多,所以 rxjs 确实在这当中不算突出,但如楼上大佬们所说,rx 这套工具衍生自 linq,是大量地开发实践后催生出来的更为成熟的异步处理思路. 至可读性降低那只是因为异步本身就需要考虑那么多复杂的场景,只是之前大部分都被忽略了.尤其是前端,以前大部分用 promise 都只考虑 success 而忽视了 failure 的处理,在前端最多控制台报个错用户刷新一下就恢复了,放在后端就可能是非常致命的 bug. |
28 asAnotherJack 2018-12-28 11:35:50 +08:00 rxjava 挺火的 |
29 xzk715 2018-12-28 15:45:59 +08:00 说 rx 主要是位了解决异步问题的 一看就不是真了解 rx |
30 Sapp 2019-01-24 10:21:35 +08:00 rx 其实我是用来做一些数据处理,如果真的数据非常多,非常乱,需要几路并流,然后经过转换输出结果,还是好用的,其他业务没什么必要,不过我还是经常用 xstream,比 rxjs 小,更简单,偶尔用用也够用了 |