本文共 1257 字,大约阅读时间需要 4 分钟。
//观察者模式实现异步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方法不能执行转载地址:http://zash.baihongyu.com/