javascript - 在 JavaScript 中创建订阅和取消订阅而不传递订阅者 ID

标签 javascript publish-subscribe

概述

我正在创建一个简单的订阅和取消订阅服务。我创建它是因为该模式很简单,我们可以避免添加额外的依赖项。

模式

模式很简单,你有一个回调数组。

subscribers = [];

还有订阅、取消订阅和发布三个函数。

subscribe(callback){
  //code
}
unsubscribe(){
  //code
}
publish(data){
  //code
}

问题

理想情况下,这就是您需要的所有信息,但是我还没有找到一种方法来干净地订阅和取消订阅,而无需传递某种 ID 来知道要从订阅者数组中删除哪个函数。如果能从 subscribe 函数的调用者那里获取函数 id 就好了。我发现有一种方法可以通过caller来做到这一点和 callee ,但不应使用它们。那么是否有选项可以从订阅调用者那里捕获唯一标识符?

最佳答案

如果您愿意更改模式,您可以让订阅创建一个取消订阅函数,该函数将回调作为其闭包的一部分,然后返回该函数。

subscribe(callback) {
   subscribers.push(callback);
   return function() {
      const index = subscribers.indexOf(callback);
      if (index > -1) {
         subscribers.splice(index, 1);
      }
   };
}
//unsubscribe() {} // Doesn't exist any more on the service
publish(data) {
   //code
}

因此,当代码的另一部分订阅时,它将保存对取消订阅函数的引用以供稍后使用。例如:

const unsubscribe = MyEventService.subscribe(function (data) {
   console.log('subscription fired!', data)
 });

// later, when this code needs to tear down
unsubscribe();
<小时/>

如果您希望保留调用服务来取消订阅的模式,我认为除了再次传递一些内容(标识符或回调函数)之外别无选择。

关于javascript - 在 JavaScript 中创建订阅和取消订阅而不传递订阅者 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46162975/

相关文章:

javascript - 子菜单(带有链接)位于(z 索引)主菜单图像后面

javascript - 在 Javascript 中检索 UTC 时间

javascript - 从两个不同的数组创建一个 JSON 对象

javascript - 如何检测事件目标最后一个子javascript

rabbitmq - 在微服务的发布/订阅模型中,如何只接收/使用每种服务类型的消息一次

sql-server - 列出当前发布用于复制 MS-SQL 的所有表

javascript - 将异步调用转换为同步?

java - 如何从 Java 中的生菜 Redis PubSub 监听器获取消息?

xmpp - xmpp 书签的自动加入选项不起作用

java - Struts 2 Action 类中的复选框值