この記事では、JavaScript のパブリッシュ/サブスクライブ モデルについて詳しく説明します (例を示します)。必要な方は参考にしていただければ幸いです。
パブリッシュおよびサブスクライブ モデル
イベント パブリッシュ/サブスクライブ モデル (PubSub) は、MVC および MVVC アーキテクチャでも非同期プログラミングでより緩やかな分離を実現するのに役立ちます。パブリッシュ・サブスクライブ・モデルへの参加にも不可欠です。
メリット: 非同期プログラミングでより深い分離を実現
デメリット: パブリッシュ/サブスクライブ モデルを使いすぎると、メンテナンスの難易度が増加します
実装サブスクリプション モードの公開
var Event = function() { this.obj = {} } Event.prototype.on = function(eventType,fn) { if(!this.obj[eventType]) { this.obj[eventType] = [] } this.obj[eventType].push(fn) } Event.prototype.emit = function() { // 取第一个参数,作为eventType var eventType = Array.prototype.shift.call(arguments); // 获取事件数组 var arr = this.obj[eventType]; var len = arr.length; // 循环数组,一次执行其中的函数 for(var i=0;i<len;i++) { // 直接调用arr[i],其this指向为undefined(严格模式下) // 因此用apply将this指向arr[i] // 数组shift函数取出第一个参数,将剩下的参数传入函数中 arr[i].apply(arr[i],arguments) } } var ev = new Event() ev.on('click',function(a) { // 订阅 console.log(a) }) ev.emit('click',1) // 发布
上記のコードは、最初にサブスクリプションを実装してから公開することしかできません。直接公開するとエラーが報告されます。まず公開してから購読するにはどうすればよいですか?
var Event = function() { this.obj = {}; this.cacheList = []; } Event.prototype.emit = function() { const args = arguments; //函数参数 const that = this; //this指向,保持cache函数的this指向 function cache() { var eventType = Array.prototype.shift.call(arg) var arr = that.obj[eventType] for (let i = 0; i < arr.length; i++) { arr[i].apply(arr[i], arg) } } this.cacheList.push(cache) // 采用闭包,保持对emit函数中参数和that的引用 } Event.prototype.on = function(eventType,fn) { if(!this.obj[eventType]) { this.obj[eventType] = [] } this.obj[eventType].push(fn) // 在订阅函数中执行emit函数中缓存的函数 for (let i = 0; i < this.cacheList.length; i++) { this.cacheList[i]() } }
これに変更すると、関数を公開してからサブスクライブするという処理が実現します。ただし、最初に公開してからサブスクライブすることのみ可能であり、その逆はできません。
以上がJavaScript パブリッシュ/サブスクライブ モデルの詳細な説明 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。