我正在尝试编写一个cometd angularjs服务。当一个应该触发回调的cometd消息发生时,永远不会调用回调。
在服务中,我收集连接到cometd服务器的代码,并公开'subscribe','unsubscribe','send','listen','removeListener'和'leave'函数。在'subscribe','unsubscribe','listen'和'removeListener'中,我还记录了服务中的订阅和监听器,以便在连接断开时重新创建它们。这是'listen'和'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);
});
希望发送到此客户端的/ service / messages通道的消息将附加到$ scope.messages,这是我模板中的div。
然而,这种情况从未发生过。我可以看到与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 :(得分:0)
当连接断开时,您不需要添加/删除侦听器,如explained in the documentation。
在握手之前配置应用程序时会添加侦听器,并保留在那里直到您明确删除它们。 您可能希望根据应用程序逻辑添加/删除侦听器,但不要这样做 - 就像您说的那样 - 以应对连接断开的事实 - 它不是必需的,而且这对您来说是不必要的工作。
订阅者应添加到/meta/handshake
成功的侦听器中,并在上面链接的文档中进行了解释。这可以保证CometD在重新发送时自动删除和重新添加订阅者 - 再次无需应用程序执行任何操作。
您还想阅读section on dynamic resubscription。
您从应用程序报告的日志记录表明您的应用程序出现了问题:不应删除监听器并像日志一样重新添加监听器 - 这是您的应用程序所做的事情,而不是CometD。
我建议您按照上述建议简化您的申请;很可能你的问题会消失。