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. NetModular 新年第一更以及升级指南(打造简单易用的.Net Core模块化快速开发框架~)

    先给大家拜个晚年,祝大家身体健康,远离肺炎~ NetModular开源已有一年,在这一年收到了很多建议,框架也变得越来越完善.这次更新包括了从去年年尾到现在所做的更改,感觉更改的内容还是蛮多的,所以记 ...

  2. C++内存管理笔记(一)

      C++内存分配的四个层面 : 四个层面的比较: 内存分配与释放的测试: ); //512 bytes free(p1); complex<int>* p2 = new complex& ...

  3. Git的指令

    一,访问本地Git 上一节我们已学会了如何注册GitHub和安装Git 现在先打开电脑终端或Git Bash,首先和Git打个招呼,输入Git 二.新建文件/进入文件夹 mkdir + 文件名    ...

  4. Codeforces 1092 D2 Great Vova Wall (Version 2) (栈)

    题意: 给一排砖,每列的高度$a_i$,问是否可以放1*2的砖,使得n列高度一样,砖只能横着放 思路: 每两个相邻的高度相同的砖可以变成大于等于它的高度的任意高度 所以像这样的 123321 是不满足 ...

  5. 小白学 Python 数据分析(5):Pandas (四)基础操作(1)查看数据

    在家为国家做贡献太无聊,不如跟我一起学点 Python 人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Panda ...

  6. C和C++中字符串与数的转换

    以下内容来自<C/C++程序设计实用案例教程> 1.在C语言中的转换方式 1.1数字转换为字符串 在C语言中,sprintf函数可以将任何多个数字格式化为指定格式的字符串,sprintf函 ...

  7. C#中HashSet的重复性与判等运算重载

    目录 一个故事-- 一个繁荣的遥远国度:泛型容器 但是我也不确定容器里能放些什么东西啊 一个英勇的皇家骑士:HashSet 值类型的HashSet 引用类型的HashSet 另外一个--故--事?? ...

  8. 大数相乘----C语言

    /* 大数相乘: 因为是大数,乘积肯定超出了能定义的范围,因此考虑用数组存储,定义三个数组,分别存储乘数,被乘数和积. 规则与平常手算一样,从个位开始分别与被乘数的每一位相乘,但是有一点不同的是:我们 ...

  9. php 的file 缓存

    PDO方式连接数据库类 <?php /** * @author 黄功延 * createTime 2018/5/28 0028 09:44 */ class Db { //私有化数据库连接数据, ...

  10. CCS过渡和动画

    过渡 过渡能让使用过渡的元素在样式发生变化时(例如鼠标划过,单击按钮,点击图片时,颜色,尺寸,位置等样式发生变化),定义变化过程中的动画,让变化不再是瞬间产生. 过渡样式使用transition定义, ...