RxJS学习笔记(一)Observable的创建 #68
zhangyu1818
announced in
zh-cn
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
题外话
为什么想要学习
RxJS
,虽然知道RxJS
在异步编程中很强大,但是在现在不管是Promise
还是async/await
,对于熟悉javascript
的程序员来说,都是很容易使用的,异步代码的执行越来越简单了但是我认为,学习不止是使用,更重要的是思想,相信能在
Rxjs
的学习中,对函数式,响应式编程能有更深的理解其实还有一点是之前看见有人发
leetcode
的招聘,技术栈是typescript + react + graphQL + rxjs
,这简直是太棒了,梦想一般的技术栈,然而人家肯定看不上现在的我,所以我要学习,成长!学习
Rxjs
,我是通过官方文档 + 程墨出版的《深入浅出RxJS》
,在书中,我看见了他的一段话我觉得这段话简直是醍醐灌顶,在我的学习道路上,有很一部分是「最新」,我喜欢最新的技术,「炫酷」也有一小部分
今后的学习,一定得脚踏实地,稳步前行,争取在被"退休"前能够进大厂吧~
创造Observable
定义
onSubscribe
方法,这个函数会作为参数传递给Observable
构造函数调用
Observable
构造函数创建一个数据流对象source$
,这时候onSubscribe
函数并没有被调用,它在等待观察者调用source$
的subscribe
方法创建``对象(观察者),这时候观察者和发布者还没有关系
调用
source$.subscribe
,将theObserver
对象作为参数传入,在subscribe
函数被调用的时候,onSubscribe
被调用,这时onSubscribe
函数的参数subscriber
所代表的就是观察者theObserver
,但并不是theObserver
本身,RxJS
会对观察者做一个封装,可以把subscriber
简单的理解为观察者的一个代理,对subscriber
对所有函数调用都会代理到观察者theObserver
对同名函数上在
onSubscribe
函数中,调用了subscriber.next
函数3次,实际上也就是调用了theObserver
的next
函数3次永无止境的Observable
Observable
可以产生无限多的数据,并且可以跨越时间这段代码,每隔一秒会将新数据推给观察者,直到我们强行终止之前,是不会终止的
因为
Observable
这样的时间特性,使得异步操作十分容易,因为观察者只需要被动接受推过来的数据,而不用关心数据是何时产生的假如我们不终止这段代码,也不会消耗更多的内存,因为每次
Observable
对象只吐出一个数据,然后就被观察者Observe
消化处理掉了,这种操作方式和把数据堆积到一个数组中是不一样的,如果使用数组,内存的消耗就会随着数组大小的改变而增加Observable的完结
在
Observable
中,next
表达的是正要推送的数据,为了让Observable
告诉Observer
已经没有数据了,需要使用另一种通信机制,就是Observer
的complete
函数修改「创建
Observable
」中的theObserver
运行程序,并没有发生什么,是因为
Observable
对象并没有调用观察者Observe
的complete
方法修改
onSubscribe
在调用
clearInterval
后,立刻调用了complete
函数,和next
函数一样,对subscriber
的complete
函数调用最终会触发观察者theObserver
的complete
函数输出结果
如果
Observable
不主动调用complete
方法,即便观察者Observer
准备了complete
函数,也不会发生任何事情在
generator
里,每次获取数据是通过next
函数,并且数据中会有标示迭代结束变量isDone
,Observable对象也是如此,完结信号也是由
Observable推给
Observer`的Observable的出错处理
除了用
next
传递数据,complete
表示观察结束,还需要一种「出错了」的方式,和complete
同样,需要使用Observer
的error
函数示例代码如下
执行结果如下
这里值得注意的是,在调用
subscriber
的error
函数后,输出「出错了」,但是并没有输入「观察结束」,说明并没有调用接下来的complete
函数这是因为在
RxJS
中,一个Observable
只有一种终结状态,要么完结complete
,要么错误error
,一旦进入出错状态,对这个Observable
对象的观察也就结束了,再也不会调用next
函数,也不会调用complete
函数和其他的error
函数Observer的简单形式
如果不创建观察者
Observer
对象,subscribe
是可以直接接受函数作为参数的,第一个参数被认为是next
,第二个参数被认为是error
,第三个参数被认为是complete
退订Observable
以上的都是
Observable
和Observer
如何建立关系,因为Observable
的执行可能是无限的,假如有这样一个需求,在订阅Observable
三秒后,取消对Observable
对订阅,应该怎么办呢?在
Observable
中,有一个退订unsubscribe
的概念在执行
source$.subscribe
后,会返回一个正在执行的Subscription
,可以调用Subscription
的unsubscribe
方法来退订但是,在执行后,
next
方法并没有接着被调用了,但是却一直在输出interval
,这是因为只是对Observable
取消订阅,但是Observale
内部可能依旧在执行某些代码在我们创建
Observable
时,必须指定Observable
应该怎么执行,即是onSubscribe
函数,在此函数中,可以返回自定义subscribe
函数来实现unsubscribe
可以看见控制台没有任何输出,说明内部
setInterval
被正确claer
掉了Beta Was this translation helpful? Give feedback.
All reactions