详解Angular2中的编程对象Observable


Posted in Javascript onSeptember 17, 2016

前言

RxJs提供的核心是Observable对象,它是一个使用可观察数据序列实现组合异步和事件编程。
跟这个很类似的异步编程模型是Promise,Promise是基于状态变化的异步模型,一旦由等待状态进入成功或失败状态便不能再次修改,当状态变化时订阅者只能够拿到一个值;而Observable是基于序列的异步编程模型,随着序列的变化,订阅者可以持续不断的获取新的值。而且Promise只提供回话机制,并没有更多的操作来支持对结果的复杂处理,而Observable提供了多种多样的操作符,来处理运算结果,以满足复杂的应用逻辑。

在实际编程中,我们主要与三个对象打交道:ObservableobserverSubscription

以一个元素的click事件为例看看如何使用Observable:

var clickStream = new Rx.Observable(observer => {
var handle = evt => observer.next(evt);
element.addEventListener('click', handle);

return () => element.removeEventListener('click', handle);
});

subscription = clickStream.subscribe(evt => {
console.log('onNext: ' + evt.id);
}, err => {
console.error('onError');
}, () => {
console.log('onComplete');
});

setTimeout(() => {
subscription.unsubscribe();
}, 1000);

如果每个事件都需要这么包装一下,岂不是太麻烦了,所以RxJs为我们提供了一个便利函数:Observable.fromEvent来方便的衔接事件。

常见的链接操作符:concat、merge、combineLates等

投影操作:map、flatMap,flatMap需要重点介绍

过滤:filter、distinctUltilChanges、

操作符分类:Operators by Categories

错误处理:catch、retry、finally

减压:debounce、throttle、sample、pausable

减少:buffer、bufferWithCount、bufferWithTime

想要掌握Observable的操作符先要学会看懂序列图:

详解Angular2中的编程对象Observable

箭头代表着随时间变化的序列,比如在一个元素上不断点击鼠标,圆圈代表序列对外产生的影响,如每一次点击元素都会触发一次事件回调,圆圈中的数字是对外发射的信息,如每一次事件的触发都会有一个事件对象,代表本次操作的一些信息。

想要灵活的运用Observable处理复杂的逻辑,就要学会使用它提供的操作符。我将操作符分为两类,单序列操作和复合序列操作,单序列操作是指的针对一个序列进行的操作运算,复合序列操作指的是对两个或者多个序列进行处理的操作符,复合序列操作相对更难懂一些。

下面先看单序列操作,以map操作为例:

详解Angular2中的编程对象Observable

map操作是将一个序列中每次对外发射的信息做转换,如上图map将每次的发射值乘以十,那么当订阅者订阅之后每次得到的订阅值就不再是原始的123而是经过转换后的10 20 30。通过序列图能更方便的理解Observable的运算。

下面我们来看一个复合序列操作,以merge为例

详解Angular2中的编程对象Observable

merge操作的目的是将两个独立序列,合成一个序列。原本序列1随着时间的前进,在100ms时发射a,在200ms时发射b,300ms时发射c,它的订阅者在400ms将受到abc三个值;序列2在150ms时发射d,250ms时发射e,350ms时发射f,它的订阅者在400ms内收到def三个值。而merge之后的新序列将在400ms内收到abcdef(注意顺序)。

常用操作符的理解:

Observable.range:发射一定数量值得序列。

Observable.toArray: 在序列完成时将所有发射值转换为一个数组。

Observable.flatMap: 将原始序列流中的元素转化为一个新的序列流,并将这个新的序列流merge到原来的序列中元素的位置。

Observable.startWith: 它会设置Observable序列的第一个值

Observable.combineLatest: 类似于promiseAll,在所有序列有结果后才会执行

Observable.scan: 将序列中每次发射的值可以做聚合,与reduce类似,reduce会将整个序列的值聚合起来,在序列完成时发送一个最终值

Observable.sample: 从持续的序列中取得一定的样品

Observable.merge:将多个序列合并成一个,可以做OR来使用

Observable.timestamp: 能够得到每个发射值的发射时的时间

Observable.distinctUntilChanged(compare, selector): selector取出用来比较的key,compare用来比较两个key

Observable.takeWhile() 当参数为false时停止发射数据

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
用CSS+JS实现的进度条效果效果
Jun 05 Javascript
JavaScript类型转换方法及需要注意的问题小结(挺全面)
Nov 11 Javascript
判断用户是否在线的代码
Mar 05 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
Mar 04 Javascript
javascript跨浏览器的属性判断方法
Mar 16 Javascript
JavaScript中的console.assert()函数介绍
Dec 29 Javascript
使用CamanJS在Web页面上处理图像的技巧
Aug 18 Javascript
Vue.js事件处理器与表单控件绑定详解
Mar 20 Javascript
react-router JS 控制路由跳转实例
Jun 15 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
Jan 27 jQuery
jquery实现进度条状态展示
Mar 26 jQuery
vue element-ul实现展开和收起功能的实例代码
Nov 25 Vue.js
详细总结Javascript中的焦点管理
Sep 17 #Javascript
js变量提升深入理解
Sep 16 #Javascript
再谈javascript常见错误及解决方法
Sep 16 #Javascript
使用JQuery中的trim()方法去掉前后空格
Sep 16 #Javascript
浅谈jQuery效果函数
Sep 16 #Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
Sep 16 #Javascript
jQuery实现的右下角广告窗体跟随效果示例
Sep 16 #Javascript
You might like
PHP在字符断点处截断文字的实现代码
2011/04/21 PHP
php递归json类实例
2014/12/02 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
Laravel使用消息队列需要注意的一些问题
2017/12/13 PHP
PHP保留两位小数的几种方法
2019/07/24 PHP
js控制当再次点击按钮时的间隔时间
2014/06/03 Javascript
javascript 动态创建表格
2015/01/08 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
vue根据值给予不同class的实例
2018/09/29 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
2018/11/25 Javascript
node.js文件操作系统实例详解
2019/11/05 Javascript
python 写的一个爬虫程序源码
2016/02/28 Python
Python编程实现删除VC临时文件及Debug目录的方法
2017/03/22 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
python实现月食效果实例代码
2019/06/18 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
请说出以下代码输出什么
2013/08/30 面试题
公共场所禁烟标语
2014/06/25 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
保安辞职信范文
2015/02/28 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书
自愿离婚协议书范本2016
2016/03/18 职场文书
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android