我正在创建一个简单的订阅和取消订阅服务。我正在创建它,因为模式很简单,我们可以避免添加附加依赖项。
模式很简单,你有一个回调数组。
subscribers = [];
三个函数订阅,取消订阅和发布。
subscribe(callback){
//code
}
unsubscribe(){
//code
}
publish(data){
//code
}
理想情况下,这是您需要的所有信息,但是我还没有找到一种方法来干净地订阅和取消订阅,而无需传递某种ID来知道要从订阅者阵列中删除哪个功能。从subscribe函数的调用者中提取函数id会很好。我发现有一种方法可以通过caller和callee执行此操作,但不应使用它们。那么有没有从subscribe的调用者那里捕获唯一标识符的选项?
答案 0 :(得分:1)
如果您愿意更改模式,您可以订阅创建一个取消订阅函数,该函数将回调作为其闭包的一部分,然后返回该函数。
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
}
因此,当您的代码的另一部分订阅时,它将保存对unsubscribe函数的引用,以便稍后使用。例如:
const unsubscribe = MyEventService.subscribe(function (data) {
console.log('subscription fired!', data)
});
// later, when this code needs to tear down
unsubscribe();
如果您希望保留调用服务的模式以取消订阅,除了传递某些内容(标识符或回调函数)之外,我没有其他选择。
答案 1 :(得分:1)
你可以做redux做的事情:
不使用专用的unsubscribe()
函数,而是返回一个回调函数,将订阅者从subscribe()
函数中删除,即:
let subscribers = [];
const subscribe = subscriber => {
subscribers.push(subscriber);
return () => {
subscribers = subscribers.filter( s => s !== subscriber);
}
}
//To subscribe
const unsubscribe = subscribe(() => doSomethingWhenEventFires());
//To unsubscribe
unsubscribe();