详解Angular2中的编程对象Observable  更新时间:2016年09月17日 09:07:54   投稿:daisy   大家都是在Reactive Extensions for Javascript诞生于几年前,随着angular2正式版的发布,它将会被更多开发者所认知。这篇文章我们来详细介绍RxJs提供的Observable对象,有需要的朋友们可以参考借鉴。 前言 RxJs提供的核心是Observable对象,它是一个使用可观察数据序列实现组合异步和事件编程。 跟这个很类似的异步编程模型是Promise,Promise是基于状态变化的异步模型,一旦由等待状态进入成功或失败状态便不能再次修改,当状态变化时订阅者只能够拿到一个值;而Observable是基于序列的异步编程模型,随着序列的变化,订阅者可以持续不断的获取新的值。而且Promise只提供回话机制,并没有更多的操作来支持对结果的复杂处理,而Observable提供了多种多样的操作符,来处理运算结果,以满足复杂的应用逻辑。 在实际编程中,我们主要与三个对象打交道:Observable、observer、Subscription: 以一个元素的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的操作符先要学会看懂序列图: 箭头代表着随时间变化的序列,比如在一个元素上不断点击鼠标,圆圈代表序列对外产生的影响,如每一次点击元素都会触发一次事件回调,圆圈中的数字是对外发射的信息,如每一次事件的触发都会有一个事件对象,代表本次操作的一些信息。 想要灵活的运用Observable处理复杂的逻辑,就要学会使用它提供的操作符。我将操作符分为两类,单序列操作和复合序列操作,单序列操作是指的针对一个序列进行的操作运算,复合序列操作指的是对两个或者多个序列进行处理的操作符,复合序列操作相对更难懂一些。 下面先看单序列操作,以map操作为例: map操作是将一个序列中每次对外发射的信息做转换,如上图map将每次的发射值乘以十,那么当订阅者订阅之后每次得到的订阅值就不再是原始的123而是经过转换后的10 20 30。通过序列图能更方便的理解Observable的运算。 下面我们来看一个复合序列操作,以merge为例 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时停止发射数据 总结 以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。 您可能感兴趣的文章: angular2使用简单介绍 Angular2从搭建环境到开发步骤详解 Angular2内置指令NgFor和NgIf详解 Angular2 环境配置详细介绍 深入理解Angular2 模板语法 Angular2 NgModule 模块详解 Angular2中Bootstrap界面库ng-bootstrap详解 最棒的Angular2表格控件 Angular2表单自定义验证器的实现 Angular2入门–架构总览 angular2 observable 相关文章 AngularJS下$http服务Post方法传递json参数的实例 下面小编就为大家分享一篇AngularJS下$http服务Post方法传递json参数的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 2018-03-03 自学实现angularjs依赖注入 这篇文章主要为大家详细介绍了angularjs依赖注入的自己成果,如何实现angularjs依赖注入,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 2016-12-12 Angular利用trackBy提升性能的方法 这篇文章主要介绍了在Angular中利用trackBy来提升性能的实现方法,需要的朋友可以参考下 2018-01-01 AngularJs bootstrap搭载前台框架——准备工作 本文主要介绍AngularJs bootstrap搭载前台框架,这里对Bootstrap 搭载环境,及注意事项做了讲解,有需要的小伙伴可以参考下 2016-09-09 Angular异步变同步处理方法 今天小编就为大家分享一篇Angular异步变同步处理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 2018-08-08 angular分页指令操作 这篇文章主要为大家详细介绍了angular分页指令操作的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 2017-01-01 解决angular2 获取到的数据无法实时更新的问题 今天小编就为大家分享一篇解决angular2 获取到的数据无法实时更新的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 2018-08-08 详解JavaScript的AngularJS框架中的表达式与指令 这篇文章主要介绍了JavaScript的AngularJS框架中的表达式与指令,文中罗列了几个常用的指令属性加以说明,需要的朋友可以参考下 2016-03-03 Angular 2应用的8个主要构造块有哪些 这篇文章主要为大家详细介绍了Angular 2应用的8个主要构造块,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 2016-10-10 AngularJS 基础ng-class-even指令用法 本文主要介绍AngularJS ng-class-even 指令,这里整理了ng-class-even基础知识资料,并附实例代码和效果图,学习AngularJS指令的朋友可以看下 2016-08-08 最新评论

前言

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的操作符先要学会看懂序列图:

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

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

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

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

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

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时停止发射数据

总结

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

您可能感兴趣的文章:

  • angular2使用简单介绍
  • Angular2从搭建环境到开发步骤详解
  • Angular2内置指令NgFor和NgIf详解
  • Angular2 环境配置详细介绍
  • 深入理解Angular2 模板语法
  • Angular2 NgModule 模块详解
  • Angular2中Bootstrap界面库ng-bootstrap详解
  • 最棒的Angular2表格控件
  • Angular2表单自定义验证器的实现
  • Angular2入门–架构总览
张贴在3