ここで奇妙な問題が発生しています。皆さんが助けてくれることを願っています。
プロジェクトの詳細
メソッドを含む大規模なアプリケーションの単純な pub/sub 実装に取り組んでいますpubsub.subscribe_once()
。このメソッドは、1 回限りのサブスクリプションの作成を有効にします。つまり、ジェネリック サブスクリプションが作成され、適切な「発行」イベントが発生してサブスクリプション コールバックが実行されると、サブスクリプション自体が削除されます。
subscribe_once: function(topic, func) {
var sub = pubsub.subscribe(topic, func),
old_func = sub.func;
// rewrite our subscription's method to remove itself after invocation
sub.func = function() {
// call the original function
old_func.apply(this);
// remove subscription from topic
pubsub.unsubscribe(sub);
};
return sub;
}
問題
このプロセスのメモリフローに何らかの問題があるようです。(以下の説明を最もよく理解するために、以下の jsfiddle デモを実行することをお勧めします。) subscribe_once('someevent') サブスクリプションを作成してから、publish('someevent') を起動します。publish メソッドが呼び出されたときに期待されることは、トピックのハッシュテーブルに、Subscription オブジェクトの配列を参照する「someevent」キーが含まれていることです。実際、topics["someevent"] を参照すると、単一のサブスクリプションを持つ配列が表示されます。ただし、トピックを参照すると、「someevent」キーが表示されますが、配列は空です!
pubsub.unsubscribe(sub);
この関数は を実行するまで起動されないように見えますが、コメントアウトすることで問題は解消されますconsole.log(topics)
。
さらに、これは特定のブラウザの「スレッド化」の問題ではないようですconsole.log
。試しconsole.log(topics, topics[topic], topics, topics[topic])
てみると同じ結果が得られます。
デモ: http://jsfiddle.net/4Ab6c/
どんな助けでも大歓迎です!ありがとう。