Angular基础(八) Observable & RxJS
对于一个应用来说,获取数据的方法可以有很多,比如:Ajax, Websockets, LocalStorage, Indexdb, Service Workers,但是如何整合多种数据源、如何避免BUG、如何提高可维护性、如何提升应用的速度,这些却又是需要解决的问题。MVC是经典的Web应用开发模式,但对于客户端应用却不太适合。针对这点又出现了一些其它的模式,比如MVW(Model-View-Whatever)双向绑定模式、Flux、Observables等。
Angular1采用双向绑定的方式,但到了Angular4,对于数据结构的选择就非常灵活了,可以根据应用的场景自行决定。
一、Observables and RxJS
Observables方式属于响应式编程(ReactiveProgramming),数据流是异步传输的,采用Observables方式需要导入RxJS库。接下来通过一个聊天应用的实现了解Observables和RxJS。
a) 聊天应用整体来说包含三部分,聊天列表、对话框、未读消息。相应地有三个Model、三个service。service维护数据流,数据流传输model,组件订阅数据流并渲染界面。
userModel包含is,name, avatarSrc三个属性;
threadModel包含的属性有id, lastMessage, name, avatarSrc;
messageModel包含的属性有 id, isRead, sentAt, anthor, text, thread.
b) UserService
创建的UsersService类需要标记为@Injectable,便于之后的注入。
import{ Subject, BehaviorSubject } from 'rxjs';
…
@Injectable()
exportclass UsersService {
currentUser: Subject<User> = newBehaviorSubject<User>(null);
public setCurrentUser(newUser: User): void {
this.currentUser.next(newUser);
}
}
currentUser是一个Subject 类型,接收了一个BehaviorSubject对象,Subject是可读可写的流,同时继承了Observable和Observer。一般来说消息发送到流后,如果没有被接收就会丢失,但可使用BehaviorSubject避免这个问题,BehaviorSubject会保存最后一次的值。
setCurrentUser()会通过Subject.next()将新的值送入流中。
c) MessageService
MessageService是这个应用的核心,所有的消息流都会经过这个Service。MessageService首先会包含三个“数据管理流”:newMessage发送新消息、messages发送最近消息的数组、update更新messages流。
update更新messages流时,采用操作流模式(Operation Stream Pattern)。
interfaceIMessagesOperation extends Function {
(messages: Message[]): Message[];
}
exportclass MessagesService {
updates: Subject<any> = newSubject<any>();
constructor() {
this.messages = this.updates
.scan((messages: Message[],
operation: IMessagesOperation)=> {
return operation(messages);
},
initialMessages).
.publishReplay(1)
.refCount();
传入updates流中的是方法,这个方法的输入和输出都是message数组,为此定义接口IMessagesOperation,然后使用Subject.scan()。
流默认是不共享的,一次读取后流中的数据就会消失,但这个应用中不少地方需要多次读取流,比如最近消息,所以使用了publishReplay和refCount方法。publishReplay设置流可在多个订阅者间共享,并可设置对新加入的订阅者的滞后值。
学习资料:The Complete Book on Angular by Nate Murray, Felipe Coury, AriLerner , Carlos Taborda
Angular基础(八) Observable & RxJS的更多相关文章
- Bootstrap <基础八>图片
Bootstrap 提供了三个可对图片应用简单样式的 class: .img-rounded:添加 border-radius:6px 来获得图片圆角. .img-circle:添加 border-r ...
- Java语言基础(八)
Java语言基础(八) 一.数学运算 + - * / % (1)凡是byte short char类型都按int类型的计算 看看上面的代码,为什么出错! 我已经将100转成byte类型,( ...
- {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...
- Java基础八--构造函数
Java基础八--构造函数 一.子父类中构造函数的特点 1.1 为什么在子类构造对象时,发现,访问子类构造函数时,父类也运行了呢? 原因是:在子类的构造函数中第一行有一个默认的隐式语句. super( ...
- 第214天:Angular 基础概念
一.Angular 简介 1. 什么是 AngularJS - 一款非常优秀的前端高级 JS 框架 - 最早由 Misko Hevery 等人创建 - 2009 年被 Google 公式收购,用于其多 ...
- Angular基础---->AngularJS的使用(一)
AngularJS主要用于构建单页面的Web应用.它通过增加开发人员和常见Web应用开发任务之间的抽象级别,使构建交互式的现代Web应用变得更加简单.今天,我们就开始Angular环境的搭建和第一个实 ...
- day 62.3 Django基础八之cookie和session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx ...
- day 73 Django基础八之cookie和session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 x ...
- Django基础八之认证模块---auth
Django基础八之认证模块---auth 目录 Django基础八之认证模块---auth 1. auth介绍 2. autho常用操作 2.1 创建用户 2.2 验证用户 2.3 验证用户是否登录 ...
随机推荐
- ElasticSearch权威指南学习(索引管理)
创建索引 当我们需要确保索引被创建在适当数量的分片上,在索引数据之前设置好分析器和类型映射. 手动创建索引,在请求中加入所有设置和类型映射,如下所示: PUT /my_index { "se ...
- python实现桶排序算法
桶排序算法也是一种可以以线性期望时间运行的算法,该算法的原理是将数组分到有限数量的桶里,每个桶再分别排序. 它的算法流程如下所示: 设置一个定量的数组当作空桶子. 寻访序列,并且把项目一个一个放到对应 ...
- postgresql-排序
postgresql的排序. https://www.cnblogs.com/flying-tiger/p/8120046.html 1.是根据排序数据量的大小来判断,如果数据量少到能够整体放到内存的 ...
- 【xsy2304】哈 最短路
题目大意:有一个$n$个点,$m$条有向边的图,有$q$组询问. 每次询问:从$a$到$b$,经过不超过$c$条边,且依次经过的边边权递增,问最短路为多少,无解输出-1. 数据范围:$n≤150$,$ ...
- 模板引擎之-jade
##### 首先我们安装jade模板引擎并编译`npm install jade --global`在项目文件夹下创建一个`index.jade`文件,并且写入```doctypehtml head ...
- bash回收站
通过替换rm命令使被删除的文件或文件夹被移动到-/.delete/日期文件夹,方便恢复 可以定期手动删除.delete文件夹或通过额外配置定期删除减少空间占用 # for rm {{ del_time ...
- TensorFlow中数据读取之tfrecords
关于Tensorflow读取数据,官网给出了三种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据. 从文件读取数据: 在TensorFlow ...
- Jmeter接口测试——跨线程组调用参数(token为例)
昨天学会了动态获取token,今天测试接口时希望能够实现跨线程调用token值. 实现原理: jmeter本身的“__setProperty”函数可以把某参数的值设置成jmeter本身的内置属性,而j ...
- Linux IPC基础(System V)
简介 IPC 主要有消息队列.信号量和共享内存3种机制.和文件一样,IPC 在使用前必须先创建,使用 ipcs 命令可以查看当前系统正在使用的 IPC 工具: 由以上可以看出,一个 IPC 至少包含 ...
- NABCD校园生活
N(Need,需求) 在校师生得到的信息分散,极大的影响了师生的学习效率,所以就会有快速得到全面信息的需求,而我们的APP正是在解决这个问题. A(Approach,做法) 我们会在主页进行信息分类, ...