【问题标题】:Cometd listener callback not being triggered in AngularJS Service在 AngularJS 服务中未触发 Cometd 侦听器回调
【发布时间】:2017-03-11 09:18:53
【问题描述】:

我正在尝试编写一个 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 } 

但我从来没有看到回调被调用。

任何帮助表示赞赏;

【问题讨论】:

  • 请添加您的cometd.configure() 部分。
  • $scope.messages 是什么类型的对象?它的append 方法定义在哪里?

标签: angularjs angular-services cometd


【解决方案1】:

当连接断开时,您不需要添加/删除侦听器,如explained in the documentation

侦听器会在您配置应用程序时握手时添加,并一直保留在那里,直到您明确删除它们。 您可能希望根据您的应用程序逻辑添加/删除侦听器,但不要这样做 - 就像您说的那样 - 以应对连接中断的事实 - 这不是必需的,而且对您来说是不必要的工作。

订阅者应该添加到/meta/handshake成功的监听器中,上面链接的文档中也有解释。这保证了 CometD 在重新握手时会自动删除和重新添加订阅者 - 再次不需要应用程序做任何事情。

您还想阅读section on dynamic resubscription

您从应用程序报告的日志记录表明您的应用程序存在问题:不应像您的日志显示的那样删除和重新添加侦听器 - 这是您的应用程序所做的,而不是 CometD。

我建议您按照上述建议简化您的申请;您的问题很可能会消失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2022-06-10
    • 2019-11-09
    • 2013-08-22
    • 2015-12-27
    相关资源
    最近更新 更多