//观察者模式实现异步
function create(fn){
let ret = false
return ({ next, complete, error })=>{
function nextFn(...args){
if(ret){
return
}
next(...args)
}
function completeFn(...args){
complete(...args)
ret = true
}
function errorFn(...args){
error(...args)
}
fn({
next: nextFn,
complete: completeFn,
error: errorFn
})
return ()=>(ret = true)
}
}
/**
*观察者
* observerable 等于({ next, complete, error })=>{
* function nextFn ...
* function complete ...
* function errorFn ...
* (observer=>{
* setTimeout(()=>{ observer.next(1) }, 1000)
* observer.next(2)
* observer.complete(3)
* })() 执行
* return ()=>( ret = true )
* }
*
*/
let observerable = create(observer => {
setTimeout(()=>{
observer.next(1)
}, 1000)
observer.next(2)
observer.complete(3)
})
/**
* 被观察者
*/
const subject = {
next: value=>{
console.log(value)
},
complete: console.log,
error: console.log
}
let unsubscribe = observerable(subject)
结果:
2
3
之所以这样是因为complete调用之后把ret设置为true所以在1秒后调用的next方法不能执行