观察者模式

//观察者模式实现异步
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方法不能执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值