あなた自身の購読を理解して実現します.リリースモードです.

2062 ワード

購読リリースモード:これは非同期プログラムに広く適用されているモードで、コールバック関数のイベント化で、しばしばトラフィック論理を結合するために使用されます.イベントのリリース者は、どのようにビジネスロジックを達成するために購読のリスニング器に注目する必要がありません.データはメッセージによって柔軟に伝達される.『深入り浅出Nodejs』はブラウザのjsシングルスレッドのため、jsコードを編纂してよく非同期、コールバック関数を使います.  、async/await例えばプロミス  私たちはすべてthen関数においてコールバック関数を導入し、着信後に何が発生しましたか?なぜコールバックはすぐに実行されないのですか?状態が発生した後に実行されるのです.同じpromiseインスタンスに複数のthen関数が登録されています.なぜ順番に実行されますか?多くの主流のライブラリやフレームワークも使用しています.例えば、mobx vue.だから、原理を纏める必要があります.この文章を読んで、収穫が多いと信じています.次にイベントクラスを構成するには、次の内容が必要です.subscribers:各属性(購読イベントタイプ)は、1つの配列に対応して、購読者(同じイベントタイプは複数の購読者がいるかもしれないので、配列に保存します.)subscribe():登録/購読者は、subscribers配列に加入者を追加し、unsubscribe():購読をキャンセルします.subscribers配列から購読者を削除します.publish():subscribers配列の各要素を巡回し、登録時に提供される方法を呼び出します.これらの3つの方法はすべてtypeパラメータが必要です.複数のイベント(例えば雑誌1冊と新聞1部を同時に発表する)を送る.
class Publisher {
    constructor(){
   this.subscribers={}
}

 subscribe(type,fn){
   //            
 if (typeof fn !=='function'){
  throw new Error (`${fn} is not a function`)
}
  if(!this.subscribers[type]){
   this.subscribers[type] = []
  }
  this.subscribers[type].push(fn);
}

unsubscribe(type,fn){
   this.subscribers[type]=this.subscribers[type].filter(item=>item!==fn)

}

 publish(type,...params){
   if(!this.subscribers[type])return;
   this.subscribers[type].forEach(item=>item(...params));
}

static makePublisher (obj){
  obj.publisher = new Publisher(); //           
  }

}

 
function fn1(name){
console.log(`hello,my name is ${name}`);
}

function meet(){
console.log('nice to meet you ');
}


function fn2 (age){
 console.log(`hello , I am ${age} years old!`);
}



var people= {};

Publisher.makePublisher(people);


people.publisher.subscribe('name',fn1);

people.publisher.subscribe('name',meet);
 people.publisher.unsubscribe('name',meet);

people.publisher.subscribe('age',fn2);

people.publisher.publish('name','Tom');
people.publisher.publish('age',30);


//hello,my name is Tom
// hello , I am 30 years old!