オブザーバモード(パブリッシュサブスクリプションモード)の簡単な実装、および実際の応用例
3468 ワード
オブザーバモード実装
最近一般的な設計モードをまとめたことを考慮すると、ちょうど最近のウィジェットプロジェクトにおけるコンポーネント間非同期通信におけるvueバスメカニズムを模倣して、メッセージの購読とパブリッシュのためのオブジェクトを実現した.そこでjsにおける観察者パターン実装を以下にまとめる.
概要目的:サブスクリプションをパブリッシュする機能を実現し、サブスクリプション機能をキャンセルするobserverオブジェクト は、パッケージ化された良好なコンポーネント間の非同期通信を解決する方法である である.の典型的な応用はvueにおけるバスメカニズム である.
主な内容は関数を発行し、発行時にパラメータ を携帯する可能性があります.は関数を購読し、メッセージを受信した後にコールバック関数 を実行する.サブスクライバおよびサブスクライバのコールバック関数をキャッシュするリスト は、関数の購読をキャンセルします.(考慮すべきことが多い) コード実装は次のとおりです. vueでは、vueオブジェクト上でこのパブリケーションサブスクリプション機能が実装されています.トランスファゲート は、vue内のバスメカニズムをシミュレートし、wepyのウィジェットプロジェクトでコンポーネント間の非同期通信のためのバスをカスタマイズする.
最近一般的な設計モードをまとめたことを考慮すると、ちょうど最近のウィジェットプロジェクトにおけるコンポーネント間非同期通信におけるvueバスメカニズムを模倣して、メッセージの購読とパブリッシュのためのオブジェクトを実現した.そこでjsにおける観察者パターン実装を以下にまとめる.
概要
主な内容
function Observer() {
this.cache = {} //
}
Observer.prototype.on = function (key,fn) {//key: ( ),fn
if(!this.cache[key]){
this.cache[key]=[]
}
this.cache[key].push(fn)
}
Observer.prototype.emit = function (key) { //arguments
if(this.cache[key]&&this.cache[key].length>0){
var fns = this.cache[key]
}
for(let i=0;ifunction (key,fn) {
let fns = this.cache[key]
if(!fns||fns.length===0){
return
}
// fn,
if(!fn){
fns=[]
}else {
fns.forEach((item,index)=>{
if(item===fn){
fns.splice(index,1)
}
})
}
}
//example
var obj = new Observer()
obj.on('hello',function (a,b) {
console.log(a,b)
})
obj.emit('hello',1,2)
//
obj.on('test',fn1 =function () {
console.log('fn1')
})
obj.on('test',fn2 = function () {
console.log('fn2')
})
obj.remove('test',fn1)
obj.emit('test')
実際の開発における使用方法//app.wpy wepy :
wepy.$bus = new Observer();
// ( )
wepy.$bus.on('test2',function(){
console.log('this is test 2')
})
wepy.$bus.emit('test2')
転載先:https://juejin.im/post/5affed5451882542bd69f2ec