博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Rxjs 02--Observable 和 observer
阅读量:5977 次
发布时间:2019-06-20

本文共 2040 字,大约阅读时间需要 6 分钟。

pull和push体系

在上篇文章中我们了解了Observer patternIterator pattern,我们可以发现Observer是生产者(Producer)主动推送数据(push ),而Iterator是消费者(Consumer)主动要求数据(pull).

那么什么是pullpush呢?

拉和推是数据生产者数据的消费者两种不同的交流协议(方式).

Producer Customer
pull Passive(被动的一方):被请求的 时候产生数据 Active(起主导的一方):决定何时请求 数据
push Active:按自己的节奏生产数据 Passive:对接收的数据做出反应(处 理接收到的数据)
  • 在"拉"体系中,数据的消费者决定何时从数据生产者那里获取数据,而生产者自身并不会意识到什么时候数据将会被发送给消费者。

每一个 JS函数都是一个“拉”体系,函数是数据的生产者,调用函数的代码通过“拉 出”一个单一的返回值来消费该数据(return语句)。

  • 在推体系中,数据的生产者决定何时发送数据给消费者,消费者不会在接收数据之前意识到它将要接收这个数据。

Promise是当今JS中最常见的Push推体系,一个Promise(数据的生产者)发送一个resolved value(成功状态的值)来注册一个回调(数据消费者),但是不同于函数的地方的是:Promise决定着何时数据才被推送至这个回调函数。

RxJS引入了Observable(可观察对象),一个全新的"推体系"。一个可观察对象是一个产生多值的生产者,并"推送给Observer(观察者)。

以下是pullpush体系的几种代表。

Single单值 Multiple多值
pull Function Iterator
push Promise Observable

RxJS 中的观察者模式和迭代器模式

前面提到RxJS 是基于观察者模式和迭代器模式以函数式编程思维来实现的, RxJS 中含有两个基本概念:ObservableObserverObservable 作为可观察对象(被观察者),是一个以惰性的方式推送多值的流集合;而 Observer 则作为观察者,根据 Observable进行处理。

ObservableObserver 之间的订阅发布关系(观察者模式) 如下:

  • 订阅:Observer 通过 Observable 提供的 subscribe() 方法订阅 Observable

  • 发布:Observable 通过回调 next 方法向 Observer 发布事件。

Observer(观察者)是Observable(可观察对象)所发送数据的消费者,Observer简单而言是一组 回调函数 , 分别对应一种被可观察对象发送的通知的类型:next, error和 complete

var observable = Rx.Observable.create(function (observer) {  observer.next(1);  observer.next(2);  observer.next(3);  setTimeout(() => {    observer.next(4);    observer.complete();  }, 1000);});console.log('just before subscribe');observable.subscribe({  next: x => console.log('got value ' + x),  error: err => console.error('something wrong occurred: ' + err),  complete: () => console.log('done'),});console.log('just after subscribe');// 结果如下just before subscribegot value 1got value 2got value 3just after subscribegot value 4done复制代码

那么迭代器模式在 RxJS 中如何体现呢?

  • nextObserver提供一个next方法来接收Observable流,是一种push形式,而Iterator是通过调用iterator.next()来获取数据,是一种pull形式。
  • complete:当不再有新的值发出时,将触发observer的complete方法;而Iterator中则是当next的返回结果中donetrue时,表示complete
  • error:当在处理事件中出现异常报错时,Observer 提供 error 方法来接收错误进行统一处理;Iterator 则需要进行 try catch 包裹来处理可能出现的错误。

转载地址:http://cwpox.baihongyu.com/

你可能感兴趣的文章
android或ios app请求参数格式
查看>>
Camera Vision - video surveillance on C#
查看>>
如何理解网络连接中的"3次握手"?
查看>>
使用Dubbo服务出现java.io.IOException: invalid constant type: 18异常解决办法
查看>>
PYKit目录
查看>>
JSON使用总结
查看>>
php-redis中文帮助手册_系统相关_config_eval_evalSha_script...
查看>>
Tomcat Context配置
查看>>
CentOS6.5安装ntopng
查看>>
mysql事务rollback&commit
查看>>
Node.js搭建Web服务器
查看>>
实现Instagram的Material Design概念设计
查看>>
php5.3安装oracle的扩展oci8与pdo_oci
查看>>
发送超长短信的协议格式
查看>>
CentOS 6.x 快速安装L2TP ***
查看>>
mysql主主复制(双主复制)配置步骤
查看>>
一篇文章能够看懂基础源代码之JAVA篇
查看>>
什么是大数据技术架构
查看>>
【分享】如何救援記憶卡中誤刪的資料
查看>>
DNS解析相关实验:7台主机的恩怨情仇
查看>>