2016-02-17 70 views
2

我有一个控制器,它使用SocketService使用的$ q.notify(..)。

SocketService.receive().then(null, null, function (data) { 
    console.log('Received data from service'); 
}); 

我预计这个回调将被删除,当控制器被销毁。但行为是不同的。例如,如果我在使用此控制器的视图中,并且在下一个SocketService $ q.notify上将路由更改为不同(控制器已销毁),然后返回(第二个启动控制器),则此回调将被触发2次。

[Controller-1] init 
[SocketService] Received event 
[Controller-1] Received data from service 
[Controller-1] $on $destroy 
[Controller-2] init 
[Controller-2] $on $destroy 
[Controller-1] init 
[SocketService] Received event 
2x[Controller-1] Received data from service 

SocketService

var listener = $q.defer(); 

receive: function() { 
     return listener.promise; 
}, 


socket.stomp.subscribe(TOPIC, function (data) { 
     console.log('[SocketService] Received event '); 
     listener.notify(JSON.parse(data.body)); 
}); 

如何删除侦听器回调与控制器破坏?

回答

2

将onProgress函数附加到可以取消的本地defer()对象。

var localDefer = $q.defer(); 

SocketService.receive().then(null, null, function onProgress(data) { 
    localDefer.notify(data); 
}); 

//use local promise 
localDefer.promise.then(null, null, function onProgress(data) {  
    console.log('Received data from service'); 
}); 

当范围被破坏,拒绝(或解决)的本地defer()对象来停止本地通知

$scope.$on("$destroy", function() { 
    localDefer.reject("scope destroyed"); 
}); 

一旦承诺解决(或者履行或拒绝),到defer()还呼吁方法(.resolve,.reject.notify)被忽略。

0

这个问题与$q根本没有关系,它与socket上的监听器有关。当控制器销毁它的范围时,听众没有得到删除。我们需要手动完成这个过程。

$scope.$on('$destroy', function (event) { 
    socket.removeAllListeners(); //will remove out all the listners 
}); 

但是我想,你的情况你订阅的事件,所以你需要做.unsubscribe该事件而破坏范围。

socket.stomp.unsubscribe(); 
+0

这不是一个DOM事件监听器。 – kxyz

+0

@kxyz我的坏..尝试更新的答案。谢谢:) –

+0

谢谢你的回答,但如果我在2个不同的地方使用相同的监听器,它将不再工作。我必须始终保持套接字的规定。 – kxyz