本片文章主要通过实现
RxJs
一些简单操作符,来进一步了解RxJs
本系列文章
本篇文章可以学到什么?
- 深入了解
Observable
- js 基础知识(类、原型)
揭开Observable面纱
Observable 即RxJs世界中的生产者:
- 它其实是一个构造函数并接收订阅者的参数,
- 提供实例方法让其可以订阅(forEach)
function Observable(forEach){
this._forEach=forEach
}
⚠️:这里使用forEach代替subscribe
,该函数功能如下:
- 接收参数形式有两种:
onNext
、onError
,onCompleted
函数,- 或者
{onNext(){},onError(){},onCompleted(){}}
- 调用构造函数并传递如下格式数据
{onNext(){},onError(){},onCompleted(){}}
Observable.prototype={
forEach(onNext,onError,onCompleted){
// call is forEach(()=>{},()=>{},..)
if(typeof onNext==='function'){
return this._forEach({
onNext,
onError:onError || function(){
},
onCompleted:onCompleted|| function(){
}
})
}
// call is forEach({onNext:()=>{},onError:()=>{}})
else if(typeof onNext==='object'){
return this._forEach(onNext)
}else{
Error('无效参数')
}
}
}
🌰: 使用如下
const observable=new Observable(subscriber=>{
subscriber.onNext(1);
setTimeout(()=>{
subscriber.onCompleted()
},1000)
})
observable.forEach({
onNext(e){
console.log('onNext',e)
},
onError(){
},
onCompleted(){
console.log('completed')
}
})
实现 fromEvent功能
- 接收参数
dom节点
与事件名称
- 返回
Observable
实例 - 返回的实例提供
dispose
方法用于取消监听
Observable.fromEvent=function(dom,eventName){
return new Observable(function forEach(observer){
const handler=(e)=>observer.onNext(e)
dom.addEventListener(eventName,handler)
// subscription
return {
dispose:()=>{
dom.removeEventListener(eventName,handler);
observer.onCompleted()
}
}
})
}