2016-02-17 64 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