import React from 'react';
import { Observable } from 'rxjs'; const FlowPage = () => { const onSubscribe = observer => {
observer.next(1);
observer.next(2);
observer.next(3);
} // 创建一个发布者
// Observable是一个特殊类,它接受一个处理Observer的函数
// 而Observer就是一个普通的对象,
// 对于Observer对象要求:它必须包含一个名为next的属性(是一个函数)
// next用于接收被推过来的数据
const source$ = new Observable(onSubscribe); // 参数就是观察者对象
const theObserver = {
next : item => console.log(item)
} // 一个观察者调用Observable对象的subscribe函数
source$.subscribe(theObserver) return <h1>rxjs学习</h1>;
}; export default FlowPage;

跨越时间的Observable

// 推送数据可以有时间间隔。
const onSubscribe = observer => {
let number = 1;
const Timer = setInterval(()=>{
observer.next(number++)
if(number > 3){
clearInterval(Timer)
}
},1000)
}

永无止境的Observable

假如我们不中断这个程序,让它一直运行下去这个程序也不会消耗更多的内存。

Observable对象每次只吐出一个数据,然后这个数据就被Observer消化处理了,不会存在数据的堆积。

const onSubscribe = observer => {
let number = 1;
const Timer = setInterval(()=>{
observer.next(number++)
},1000)
}

Observable的完结

Observer时刻准备着接收数据,如果没有推送数据了,相关的资源不会被释放,为了让Observer明确知道这个数据流已经不会再有新的数据,

需要调用Observer的complete函数。

import React from 'react';
import { Observable } from 'rxjs'; const FlowPage = () => { // 推送数据可以有时间间隔。
const onSubscribe = observer => {
let number = 1;
const Timer = setInterval(()=>{
observer.next(number++)
if(number > 3){
clearInterval(Timer)
observer.complete();
}
},1000)
}
const source$ = new Observable(onSubscribe); const theObserver = {
next : item => console.log(item),
complete:()=> console.log(' no more data')
} source$.subscribe(theObserver) return <h1>rxjs学习</h1>;
}; export default FlowPage;

observable的错误处理

// 一旦进入出错状态,observable就终结了,就不会再调用后面的next()和complete()
// 调用了complete()函数终结,也不能再调用next()和error()
const onSubscribe = observer => {
observer.next(1);
observer.error('something wrong!')
observer.complete()
}
const source$ = new Observable(onSubscribe); const theObserver = {
next : item => console.log(item),
error: err => console.log(err),
complete:()=> console.log(' no more data')
} source$.subscribe(theObserver)

Observable简洁形式

// 为了让代码更加简洁,没有必要创建一个参数对象。
// subscribe也可以直接接受函数作为参数,
// 第一个参数如果是函数类型,就会被认为是next
// 第二参数被认为是error
// 第三个参数complete
source$.subscribe(
item => console.log(item),
err => console.log(err),
()=> console.log(' no more data')
)

Observable退订

// 返回一个对象,并且对象包含了unsubscribe函数,表示退订
const onSubscribe = observer => {
let number = 1;
const Timer = setInterval(()=>{
observer.next(number++)
},1000)
return {
unsubscribe:()=>{
clearInterval(Timer)
}
}
}
const source$ = new Observable(onSubscribe); // subscribe函数的返回结果存为变量subscription
const subscription = source$.subscribe(
item => console.log(item),
err => console.log(err),
()=> console.log(' no more data')
) // 3.5s后调用退订
// 3.5s后不再接受到被推送的数据,但是Observable的source$资源并没有终结
// 因为始终没有调用complete,只不过再也不会调用next函数了
setTimeout(()=>{
subscription.unsubscribe()
},3500)

修改以下代码,便于观察

// 返回一个对象,并且对象包含了unsubscribe函数,表示退订
const onSubscribe = observer => {
let number = 1;
const Timer = setInterval(()=>{
console.log('in onSUbscribe ',number)
observer.next(number++)
},1000)
return {
unsubscribe:()=>{
// clearInterval(Timer)
}
}
}

执行结果如下:

由此可见,Observable对象source$在退订以后依然在不断调用next函数,

但是已经断开了source$对象和Observer的连接。

所以onSubscribe中如何调用next,observer都不会做出任何响应

rxjs简单的Observable用例的更多相关文章

  1. SSM-MyBatis-01:IDEA的安装,永久注册和简单的MyBatis用例

    一,IDEA的安装和永久注册 1.安装: 那到安装包,下一步,选路径,上面可以选操作系统64/32位,下面是程序的默认打开方式,可以不必勾选,也可以全选 路径一定不包含中文,重点 2.永久注册: 将此 ...

  2. Oracle简单脚本演示样例

    Oracle简单脚本演示样例 1.添加表 --改动日期:2014.09.21 --改动人:易小群 --改动内容:新增採购支付情况表 DECLARE VC_STR           VARCHAR2( ...

  3. rxjs简单入门

    rxjs全名Reactive Extensions for JavaScript,Javascript的响应式扩展, 响应式的思路是把随时间不断变化的数据.状态.事件等等转成可被观察的序列(Obser ...

  4. rxjs 简单的demo

    开发环境是使用 create-react-app 创建的.再使用 $ cnpm install rxjs 来安装即可开始. $ npx create-react-app my-app $ cd my- ...

  5. Appium+python的一个简单完整的用例

    最近一直在忙,终于有时间来整理一下,传一个简单的用例,运行之后可以看到用例的报告,希望对大家有帮助. HTMLTestRunner这个包网上有很多,大家可以自己下载. 1 import unittes ...

  6. C#中的简单工厂和单例

    下面首先来说说简单工厂 举个例子: 首先是父类 public abstract class Pizza { public abstract string Info(); } } 子类 public c ...

  7. 从一个简单的Java单例示例谈谈并发

    一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这么写 public class UnsafeLazyInitiallization { private static Un ...

  8. [Javascript + rxjs] Introducing the Observable

    In this lesson we will get introduced to the Observable type. An Observable is a collection that arr ...

  9. 从一个简单的Java单例示例谈谈并发 JMM JUC

    原文: http://www.open-open.com/lib/view/open1462871898428.html 一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这 ...

随机推荐

  1. webpack4.0 ---引用vue文件

    一.引入Vue 1.安装依赖环境 npm i vue-loader -D;//解析转化.vue文件,npm i vue-style-loader -D npm i vue-template-compi ...

  2. laravel 学习笔记 — 神奇的服务容器

     2015-05-05 14:24 来自于分类 笔记 Laravel PHP开发 竟然有人认为我是抄 Laravel 学院的,心塞.世界观已崩塌. 容器,字面上理解就是装东西的东西.常见的变量.对象属 ...

  3. springmvc中applicationapplicationContext头部代码

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  4. Node——request使用代理

    本文知识点 Node环境搭建 使用代理 进阶学习 环境配置 Node 安装request 安装request npm install request 确认环境安装无误 node -v 代码样例 使用代 ...

  5. FPGA VGA+PLL+IP核笔记

    1.实现了预定功能!整个工程,没有使用例程的25MHZ,全部统一使用50MHZ.2.分辨率使用了800*600@72HZ.3.实现了只显示白色部分,黑色部分RGB == 0,要显示背景色.VGA图形基 ...

  6. 使用ClouderaManager管理的HBase的RegionServer无法启动(启动失败)的问题

    问题概述 "新冠期间"远程办公,需要重新搭建一套ClouderaManager(CM)开发环境,一位测试同事发现HBase的RegionServer无法启动,在CM界面上启动总是失 ...

  7. mybaits分页插件的使用

    1.导入依赖坐标 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>p ...

  8. git push 的解决方案

    如果输入$ git push origin master 提示出错信息: 或者 失败的原因:不能 push 远端仓库 原因分析:由于你当前分支落后与远程端对应分支,所以无法更新: 解决方案:使用 gi ...

  9. 在IDEA中如何使用lombok插件

    lombok 插件 lombok是一款可以精减java代码.提升开发人员生产效率的辅助工具,利用注解在编译期自动生成 setter/getter/toString()/constructor之类的代码 ...

  10. spark读取文件机制 源码剖析

    Spark数据分区调研 Spark以textFile方式读取文件源码 textFile方法位于 spark-core_2.11/org.apache.spark.api.java/JavaSparkC ...