2017-03-11 7 views
0

cometd angularjs 서비스를 작성하려고합니다. 콜백을 트리거해야하는 cometd 메시지가 발생하면 콜백이 호출되지 않습니다.AngularJS 서비스에서 Cometd 리스너 콜백이 트리거되지 않음

cometd 서버에 연결하여 'subscribe', 'unsubscribe', 'send', 'listen', 'removeListener'및 'leave'기능을 노출하는 코드를 수집합니다. 'subscribe', 'unsubscribe', 'listen'및 'removeListener'에서 구독 및 청취자를 서비스에 기록하여 연결이 끊어진 경우 다시 만들 수 있습니다. 여기의 removeListener '을'듣고 '과의 코드입니다 :

var listeners = {}; //Each property, named 'channel', contains an array 
        //containing listener, channel, callback 


listen: function(channel, callBack) { 
    console.log("add listener for " + channel + " called"); 
    var lis = cometd.addListener(channel, callBack); 
    listeners[channel] = [lis, channel, callBack]; 

    return lis; 
}, 

removeListener: function(lis) { 

    var lis = false; 
    lis = listeners[channel][0]; 
    delete listeners[channel]; 

    if(lis) { 
    cometd.removeListener(lis); 
    } 
}, 

컨트롤러에서, 나는 내 cometdService을 포함하고 서비스 채널들을 수 있습니다. 내 콜백 함수는 다음과 같습니다

CometdService.listen("/service/messages", function(msg) { 

    console.log("CometdService for /service/messages with msg.data: " + msg.data); 
$scope.messages.append(msg.data); 
}); 

희망이 클라이언트의/서비스/메시지 채널에 전송 된 메시지는 내 템플릿의 사업부 인 $ scope.messages에 추가됩니다되고있다.

그러나 결코 발생하지 않습니다. 나는 cometd 서버에 만들어지고 연결을 볼 수있다, 나는 콜백이 등록되는 것을 볼 수 있습니다

add listener for /service/messages called CometdService.js:129:6 
09:37:55.737 Adding listener on /service/messages with scope undefined and callback function LoggedInCtrl/listener<() cometd.js:1275:17 
09:37:55.738 Added listener Object { channel: "/service/messages", scope: undefined, callback: LoggedInCtrl/listener<(), listener: true, id: 0 } cometd.js:1275:17 

는 거의 즉시, 내가 삭제되는 리스너을 본 후 다시 추가 :

09:37:56.229 Removed listener Object { 0: "/service/messages", 1: 0, channel: "/service/messages", scope: undefined, callback: LoggedInCtrl/listener<(), listener: true, id: 0 } cometd.js:1275:17 
09:37:56.231 Adding listener on /service/messages with scope undefined and callback function LoggedInCtrl/listener<() cometd.js:1275:17 
09:37:56.232 Added listener Object { channel: "/service/messages", scope: undefined, callback: LoggedInCtrl/listener<(), listener: true, id: 1 } cometd.js:1275:17 

그때 참조 서버로부터의 메시지가 수신되고 있습니다 :

09:37:56.310 Transport websocket received websocket message message { target: WebSocket, isTrusted: true, data: "[{"data":"{\"msg\":\"Hello\"}","channel":"/server/messages"}]", origin: "ws://localhost:8080", lastEventId: "", ports: Object, currentTarget: WebSocket, eventPhase: 2, bubbles: false, cancelable: false, defaultPrevented: false } Object { envelopes: Object[3], timeouts: Object[3], webSocket: WebSocket } 

그러나 콜백이 호출되는 것을 본 적이 없습니다.

도움을 주시면 감사하겠습니다.

+0

'cometd.configure()'부분을 추가하십시오. – lin

+0

어떤 종류의 객체가'$ scope.messages'입니까? 'append' 메소드는 어디에 정의되어 있습니까? – georgeawg

답변

0

explained in the documentation과 같이 연결이 끊어진 경우 리스너를 추가하거나 제거 할 필요가 없습니다.

을 핸드 셰이크 전에 전에 구성하고 명시 적으로 제거 할 때까지 리스너가 남아 있습니다. 응용 프로그램 논리를 기반으로 리스너를 추가/제거 할 수는 있지만 연결이 끊어진 사실에 대처하기 위해 말하지 않아도됩니다. 필요하지 않으며 사용자가 불필요한 작업을하지 않아도됩니다.

성공적인 청취자 인 /meta/handshake에 구독자를 추가해야하며 위 링크 된 설명서에서도 설명합니다. 이는 가입자가 다시 핸드 셰이크 (rehandshake)시 CometD에 의해 자동으로 제거되고 다시 추가됨을 보장합니다. 다시 말하면 응용 프로그램이 아무 것도 할 필요가 없습니다.

또한 section on dynamic resubscription을 읽고 싶습니다.

응용 프로그램에서보고 한 로깅은 응용 프로그램의 잘못된 점이 있음을 나타냅니다. 로그를 삭제 한 후 다시 추가하면 안됩니다. 이는 응용 프로그램이 아닌 CometD의 기능입니다.

위의 조언에 따라 응용 프로그램을 단순화하는 것이 좋습니다. 가장 가능성이 큰 문제는 사라질 것입니다.