RxJS + Redux + React = Amazing!(译一)
今天,我将Youtube上的《RxJS + Redux + React = Amazing!》翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频:
https://www.youtube.com/watch?v=AslncyG8whg
开场白
管理状态很困难,对吧?如果你写过复杂应用,你一定对此深恶痛绝。React社区还有Angular2社区和Ember社区现在都开始使用一个库,叫Redux。为什么?因为它让管理状态变得简单多了。但Redux有个问题,就是它对你写异步代码没什么帮助,因为Redux认为异步是个比管理状态更难的问题。特别是当你试图去解决一些复杂问题,比如:并行或多重WebSockets。这些问题本身就很复杂,你也没辙。所以,这次演说将会介绍使用另一个库,叫RxJS。这个库至少可以让异步问题变得可控可管理,至少可以让你知道发生了什么。

自我介绍
我是谁?我是Jay Phelps。很明显,照片中的衬衫不是我今天穿的,尽管它们很像,(歪果仁就是啰嗦,不过场下听众听到这都乐了)。其实我穿了另外一件蓝色衬衫,但这是我的推特头像,它可以帮助那些还没有认出我的人认出我来。很明显,我是Netflix的软件工程师。你可以关注我,通过下划线jayphelps(就是_jayphelps,然后他又扯了一些没用的,说有另外一个jayphelps,是一个16岁的家伙,经常转推一些足球图片。他说他经常说这个梗,因为很多本来要关注他的人,都去关注那个16岁足球小哥了)。

什么是Redux
让我们开始讨论什么是Redux。这个演说不会详细介绍Redux和RxJS,因为它们本身就有非常多相关的演说,但我会给你们一个速成教程。这样,即便你不知道它们具体是什么,至少可以了解个大概。Redux提供了一个可预测的状态管理,它通过action和reducer来完成这个工作。那么什么是action?action被用来描述发生的事,但它不关心如何这件事如何发生。让我们来看个例子吧!
{
type: "CREATE_TODO",
payload: "Build my first redux app"
}
这是个简单的action,通过这个action,你知道了你要去创建一个todo,这个todo的内容是什么,但它没说如何去创建这个todo,它没说是是否要与服务器交互,也没说是否要存到数据库或localstorage中,它没有进行异步操作,它是个完全可以被序列化的对象。那么什么是reducer?reducer是一些纯函数,这意味着每次你给了一样的输入,那么就会有一样的输出,没有副作用。reducer的具体功能是输入上个的state和action,然后输出新的state,当然新的state可以和上个state完全一样(就是case为default的情况)。举个非真实场景的例子吧,这是个计数器的例子:
export default function counter(state = 0, action) {
switch (action.type) {
case INCREMENT_COUNTER:
return state + 1
case DECREMENT_COUNTER:
return state - 1
default:
return state
}
}
我们仅仅就是选择action类型,当action是加一,state就加一,action是减一,state就减一,就是这么字面性质的工作。reducer负责state更新,但它必须是同步的。这意味着,如果reducer收到加一的action,那么就必须立马加一。reducer不能去除速率过快的事件(debounce),也不能和服务器交互,也不能问“我是否可以加一“。reducer只能受到action,然后立马同步执行。

异步
我们平时都做些什么类型的异步操作呢?(竟然没有衔接,直接从Redux转折到异步)为何说异步是个难缠的问题呢?常见的异步事件操作包括:
- 用户交互(键盘、鼠标)
- Ajax(这就像面包和黄油一样熟悉,我们每个人都会做Ajax请求)
- 计时器/动画
- Web Sockets
- Web Workers
这不是个详细的列表。上述其中一些可以同步处理,尽管它们本身是异步的。React与Redux已经封装好了,你可以直接同步处理它们!(然后,他举了一个例子,React组件的点击事件,可以触发加一的action,然后reducer处理这个action)从技术角度上来说,这些事件是异步的,但你可以用同步的方式来处理它。为什么?因为React已经帮你处理了异步。但是,问题来了,如果你还想要点击,如果你想去除速率过快的事件,比如,用户点了很多次,而你不想每次都进行事件处理。这时,你通常会计算点击间隔,然后只处理间隔较大的点击事件。有时候,你需要像这样的更多的控制。这些控制包括:
- Ajax取消/组合(组合的意思是,比如你发起了一个Ajax,然后你又发起了另外一个Ajax,后一个的发起用到了前一个的响应数据)
- Debounce/throttle/buffer等这些与时间相关的操作
- Drag and Drop
- Web Sockets, Web Workers, etc
在Redux世界里,人们经常使用中间件来处理这些操作。所有action在你发起后,和到达reducer前,都必须穿过中间件。现在已经有很多中间件使用回调和Promise来做这些事了(指那些复杂的异步操作)。下面就让我们看看这两种最常用的异步处理方法吧!

回调和Promise
回调对大家来说非常熟悉,因为它是JavaScript最原始的处理异步的方式(然后他举了个回调的例子,回调太简单,不再赘述)。但是回调有很多问题,其中最常见的就是“回调地狱“。大家几乎都见过这种代码(他指着屏幕上的代码示例)。如果你想改变代码,比如做点这样的事:
- 条件判断,然后决定是否进行下一个异步
- 你不想顺序执行这些异步
- 更加复杂的回调操作,比如你想并发它们等
那么事情就变得非常复杂了,对吧?我的同事称回调地狱是“V型电吉他“,因为它们的形状非常相似。不过,有了一种解决方案,叫Promise。使用Promise有个绝招,那就是如果你给Promise提供了一个回调,这个回调也返回了一个Promise,那么你可以将其写为平行的风格(这算什么绝招啊,大多数人都知道吧!)。如果你理解了这种模式,那么Promise的代码将会变得非常易读。这很棒,它是个非常好的候选方案。让我们更深入的了解一下Promise吧!Promise拥有这些特性:
- 被保证的未来(意思是,一旦你创建了一个Promise,那么它肯定会执行它要做的事情,你不能停止它,开始黑Promise了。)
- 不可变
- 单一的值(意思是,如果你监听一个Promise很多次,你只会得到相同的值,而不是执行多次请求 )
- 缓存
在真实项目中,你会发现“被保证的未来“和“单一的值“是个问题,先说“被保证的未来“吧,Promise是不能被取消的。或许你会问,我既然创建了一个Promise,为何要取消它?以下场景,你就要取消你的Promise,也就是异步请求:
- 改变路由/视图(他举了Netflix的一个例子,大概就是点进一个页面,然后后悔了就返回了,这时需要取消请求)
- 自动补全(这个例子比较常见,自动补全总不能每次键盘按下都发请求吧?)
- 用户非要你取消
可见,取消异步是一个非常常用,但是容易被忽略的需求。再说Promise的“单一的值“吧!(然后开始黑Promise的“单一的值“,不过他欲扬先抑了一下),其实绝大多数场景下,我们只需要单一的值,比如Ajax,请求-响应,就是单一的值。但人们不只想做这些事,像之前提到的:
- 用户交互(键盘、鼠标)
- Ajax(这就像面包和黄油一样熟悉,我们每个人都会做Ajax请求)
- 计时器/动画
- Web Sockets
- Web Workers
上述场景也就Ajax是单一的值,其他几个场景都不是。那我们该怎么办呢?那就是使用Observable!

未完待续
这个视频太长了,今天就到此为止吧!在这篇文章中,我们主要听了Jay Phelps:
- 讲了Redux和异步
- 黑了回调和Promise
下篇文章我们将听他:
- 吹Observable的牛
- 讲述他和他搭档造redux-obserable这个轮子背后的故事!
第二篇已经发布:RxJS + Redux + React = Amazing!(译二)
RxJS + Redux + React = Amazing!(译一)的更多相关文章
- RxJS + Redux + React = Amazing!(译二)
今天,我将Youtube上的<RxJS + Redux + React = Amazing!>的后半部分翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: ht ...
- Redux & React & react-redux
Redux Redux & React & react-redux https://redux.js.org/ https://redux.js.org/api https://red ...
- Redux React & Online Video Tutorials
Redux React & Online Video Tutorials https://scrimba.com/@xgqfrms https://scrimba.com/c/cEwvKNud ...
- [Redux] React Todo List Example (Toggling a Todo)
/** * A reducer for a single todo * @param state * @param action * @returns {*} */ const todo = ( st ...
- [Redux] React Todo List Example (Adding a Todo)
Learn how to create a React todo list application using the reducers we wrote before. /** * A reduce ...
- [Redux] React Todo List Example (Filtering Todos)
/** * A reducer for a single todo * @param state * @param action * @returns {*} */ const todo = ( st ...
- Flux --> Redux --> Redux React 入门
本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...
- Flux --> Redux --> Redux React 基础实例教程
本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...
- Flux --> Redux --> Redux React 入门 基础实例使用
本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...
随机推荐
- SQLSERVER走起微信公众帐号已经开通搜狗微信搜索
SQLSERVER走起微信公众帐号已经开通搜狗微信搜索 请打开下面链接 http://weixin.sogou.com/gzh?openid=oIWsFt-hiIb_oYqQHaBMoNwRB2wM ...
- pt-table-checksum
pt-table-checksum是percona公司提供的一个用于在线比对主从数据一致性的工具. 实现原理 将一张大表分成多个chunk,每次针对一个chunk进行校验,同时将校验的结果通过REPL ...
- Java 8五大主要功能为开发者提供了哪些便利?
两年前当Java 8发布后,立即受到了业界的欢迎,因为它大大提高了Java的性能.它独特的卖点是,顾及了编程语言的每一个方面,包括JVM(Java虚拟机)和编译器,并且改良了其它帮助系统. Java是 ...
- IE8/9 本地预览上传图片
本地预览的意思是,在选择图片之后先不上传到服务器,而是由一个<img>标签来预览本地的图片,非 IE8/9 浏览器可以从<input type="file"/&g ...
- 七牛云:ckeditor JS SDK 结合 C#实现多图片上传。
成功了,搞了2天.分享一下经验. 首先是把官方的那个例子下载下来,然后照如下的方式修改. 其中tempValue是一个全局变量. function savetoqiniu() { var upload ...
- 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~
一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...
- trigger事件模拟
事件模拟trigger 在操作DOM元素中,大多数事件都是用户必须操作才会触发事件,但有时,需要模拟用户的操作,来达到效果. 需求:页面初始化时触发搜索事件并获取input控件值,并打印输出(效果图如 ...
- 使用HTML5的cavas实现的一个画板
<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta http-e ...
- 【从零开始学BPM,Day5】报表配置及自定义功能页面开发
[课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第五天课程] 1.课程概要 Step 1 软件下载:H3 BP ...
- 在 SharePoint Server 2016 本地环境中设置 OneDrive for Business
建议补丁 建议在sharepoint2016打上KB3127940补丁,补丁下载地址 https://support.microsoft.com/zh-cn/kb/3127940 当然不打,也可以用O ...