今回は、JS イベントを最初に公開してからサブスクライブする方法について説明します。JS イベントを最初に公開してからサブスクライブするための 注意事項 とは何ですか。
私は以前にeventマネージャーを書いたことがありますが、これは通常の購読してから公開するモデルです。ただし、実際のシナリオでは、後から購読する人も公開されたメッセージを受信できるようにする必要があります。たとえば、WeChat の公開アカウントをフォローすると、過去のニュースを見ることができます。 QQ オフライン メッセージと同様に、最初に送信します。ログイン後に受信できます。 イベントをサブスクライブするすべてのメソッドが確実に実行できるようにするためです。
var eventManger = { cached: {}, handlers: {}, //类型,绑定事件 addHandler: function (type, handler) { if (typeof handler !== "function") return; if (typeof this.handlers[type] == "undefined") { this.handlers[type] = []; } this.handlers[type].push(handler); if (this.cached[type] instanceof Array) { //说明有缓存的 可以执行 handler.apply(null, this.cached[type]); } }, removeHandler: function (type, handler) { var events = this.handlers[type]; for (var i = 0, len = events.length; i < len; i++) { if (events[i] == handler) { events.splice(i, 1); break; } } }, trigger: function (type) { //如果有订阅的事件,这个时候就触发了 if (this.handlers[type] instanceof Array) { var handlers = this.handlers[type]; var args = Array.prototype.slice.call(arguments, 1); for (var i = 0, len = handlers.length; i < len; i++) { handlers[i].apply(null, args); } } //默认缓存 this.cached[type] = Array.prototype.slice.call(arguments, 1); } };
eventManger.addHandler("test", function (res) { console.log("先订阅,后发布1", res); }) eventManger.trigger("test", 2); eventManger.addHandler("test", function (res) { console.log("先发布,后订阅2", res); }) eventManger.addHandler("test", function (res) { console.log("先发布,后订阅3", res); })
変数 とエージェント関数を設定し、両方のイベントが完了した後に B を実行することもできます。コードは次のとおりです。
var aReady = false;var cReady = false; eventManger.addHandler("A", function () { aReady = true; console.log("do A"); proxyC(); }); eventManger.trigger("A", 2);function doB() { console.log("do B"); //实际B中的方法需要在A事件成功之后才能执行}function doC() { console.log("do C"); cReady = true; proxyC(); }function proxyC() { aReady && cReady && doB(); } doC();
ステータス を決定するのは、デッド ループ につながる可能性があります。
var aReady = false; eventManger.addHandler("A", function () { aReady = true; console.log("do A"); });function doB() { console.log("do B"); //实际B中的方法需要在A事件成功之后才能执行}function doC() { console.log("do C"); if (!aReady) { console.log("wating..."); setTimeout(doC, 50); return; } doB(); } doC(); eventManger.trigger("A", 2);//模拟A事件触发迟
eventManger.trigger("A", 2);function doB() { console.log("do B"); //实际B中的方法需要在A事件成功之后才能执行}function doC() { console.log("do c"); eventManger.addHandler("A", function () { console.log("do a"); doB(); }); } doC();
protobuf.jsおよびLong.jsの使用の詳細な説明
以上が最初に JS イベントを発行してからサブスクライブする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。