angular 用Observable实现异步调用的方法


Posted in Javascript onDecember 27, 2018

Observable(可观察对象)

Observable(可观察对象)是基于推送(Push)运行时执行(lazy)的多值集合。

拉取(Pull)和推送(Push)

拉取和推送是数据生产者和数据消费者之间通信的两种不同机制。

  • 拉取:在拉取系统中,总是由消费者决定何时从生产者那里获得数据。生产者对数据传递给消费者的时间毫无感知(被动的生产者,主动的消费者)
  • 推送:在推送系统中生产者决定何时向消费者传递数据,消费者对何时收到数据毫无感知(被动的消费者)

js中的Promise和Observable

  • 现代JavaScript中Promise是典型的推送系统。作为数据生产者的Promise通过resolve()向数据消费者——回调函数传递数据:与函数不同,Promise决定向回调函数推送值的时间
  • RxJS在JavaScript中引入了Observable(可观察对象)这个新的推送系统。Observable是多数据值的生产者,向Observer(被动的消费者)推送数据

Observable与函数、promsise

  • 函数是当调用才同步计算,并最终只返回一个值的
  • promise是会或者不会返回一个值
  • Observable是当调用才同步或者异步地计算,并可能产生0到无穷多个值的

Observable是函数概念的拓展

  • Observable就像一个没有参数的函数,并不断生成一些值供我们使用,因此它也像是一个事件发射机(EventEmitters)
  • 在Observable中subscribe就像call一个函数,你订阅它,它才会被'启动'。同一个Observable对于不同的subscribe,是不会共享结果的(通常情况下这样子的,但可以通过调用api来共享)

Observable四大核心

创建

  • Rx.Observable.create是Observable构造函数的别名,接受一个参数:subscribe函数
  • 除了使用create创建Observable,我们通常还使用创建操作符, 如of,from,interval,等来创建Observable

订阅

  • observable.subscribe和Observable.create(function subscribe(observer) {…})中的subscribe不是同一个对象,但在工程中可以在概念上视两者为等价物
  • 调用subscribe的观察者并不会共享同一个Observable
  • 订阅机制与处理事件的addEventListener/removeEventListenerAPI完全不同。通过observable.subscribe,观察者并不需要在Observable中进行注册,Observable也不需要维护订阅者的列表
  • 订阅后便进入了Observable的执行阶段,在执行阶段值和事件将会被传递给观察者供其消费

执行

  • 只有在被订阅之后Observable才会执行,执行的逻辑在Observable.create(function subscribe(observer){…})中描述,执行后将会在特定时间段内,同步或者异步地成产多个数据值
  • Observable在执行过程中,可以推送三种类型的值:
    • “Next” 通知: 实际产生的数据,包括数字、字符串、对象等
    • “Error” 通知:一个JavaScript错误或者异常
    • “Complete” 通知:一个不带有值的事件
  • 在Observable的执行过程中,0个或者多个“Next”通知会被推送
  • 在错误或者完成通知被推送后,Observable不会再推送任何其他通知

终止

  • Observable的执行可能是无限的,作为观察者需要主动中断执行:我们需要特定的API去终止执行过程
  • 因为特定的观察者都有特定的执行过程,一旦观察者获得想要的数据后就需要终止执行过程以免带来计算时对内存资源的浪费
  • 在observable.subscribe被调用时,观察者会与其执行作用域绑定,同时返回一个Subscription类型的对象,通过调用subscription.unsubscribe()你可以终止执行过程

angular 有个类叫Observable。 从名字可以看出它提供一个观察者模式的类似功能。

也就是说,当我们把一个函数的返回值用Observable类包装后, 调用函数的使用方就可以订阅该函数,然后在得到通知后处理后续的事情, 也就是异步的调用过程而不是同步等待。

import { Observable } from 'rxjs/rx';
import { of } from 'rxjs/observable/of';

getHeroes(): Observable<Hero[]> {
this.messageService.add('HeroService: fetched heroes');

return of(HEROES);
}

上面的函数用Observable封装, of强转后就是一个异步的函数, 这样外部在函数完成后调用后续的处理,比如refresh
this.heroService.getHeroes().subscribe(heroes => this.refreshTree(heroes));

参考:

https://stackoverflow.com/questions/37364973/promise-vs-observable
https://angular.cn/tutorial/toh-pt4#observable-data

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
匹配任意字符的正则表达式写法
Apr 29 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
Jun 09 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
Aug 07 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
Jun 14 Javascript
JS中微信小程序自定义底部弹出框
Dec 22 Javascript
在使用JSON格式处理数据时应该注意的问题小结
May 20 Javascript
JavaScript中一些特殊的字符运算
Aug 17 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
Sep 30 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
May 01 Javascript
JS 创建对象的模式实例小结
Apr 28 Javascript
使用原生javascript开发计算器实例代码
Feb 21 Javascript
利用uni-app生成微信小程序的踩坑记录
Apr 05 Javascript
详解CommonJS和ES6模块循环加载处理的区别
Dec 26 #Javascript
vue-router beforeEach跳转路由验证用户登录状态
Dec 26 #Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
Dec 26 #Javascript
使用Sonarqube扫描Javascript代码的示例
Dec 26 #Javascript
angular6的table组件开发的实现示例
Dec 26 #Javascript
详解VUE里子组件如何获取父组件动态变化的值
Dec 26 #Javascript
JavaScript基础之静态方法和实例方法分析
Dec 26 #Javascript
You might like
php检查页面是否被百度收录
2015/10/28 PHP
PHP实用小技巧之调用录像的方法
2019/12/05 PHP
JavaScript 实现??打印?理
2007/04/28 Javascript
JS input 数字验证代码
2009/07/30 Javascript
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
JavaScript数组合并的多种方法
2016/05/22 Javascript
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
vue实现单选和多选功能
2017/08/11 Javascript
Vue实现购物车场景下的应用
2017/11/27 Javascript
js中let和var定义变量的区别
2018/02/08 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
python 布尔操作实现代码
2013/03/23 Python
Python解释执行原理分析
2014/08/22 Python
Python封装shell命令实例分析
2015/05/05 Python
python的pdb调试命令的命令整理及实例
2017/07/12 Python
Python编程之基于概率论的分类方法:朴素贝叶斯
2017/11/11 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
Python学习笔记之视频人脸检测识别实例教程
2019/03/06 Python
Python中turtle库的使用实例
2019/09/09 Python
python双向链表原理与实现方法详解
2019/12/03 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
2020/04/10 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
css3+jq创作含苞待放的荷花
2014/02/20 HTML / CSS
基于 HTML5 WebGL 实现的垃圾分类系统
2019/10/08 HTML / CSS
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
美国独家设计师眼镜在线光学商店:Glasses Gallery
2017/12/28 全球购物
假释思想汇报范文
2014/10/11 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书