Обратный вызов прослушивателя Cometd не запускается в службе AngularJS

Я пытаюсь написать сервис cometd angularjs. Когда происходит сообщение cometd, которое должно вызвать обратный вызов, обратный вызов никогда не вызывается.

В сервисе я собираю код для подключения к серверу cometd и предоставляю функции «подписаться», «отказаться от подписки», «отправить», «прослушать», «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);
});

в надежде, что сообщения, отправленные в канал / 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 } 

Но я никогда не видел обратного вызова.

Любая помощь приветствуется;


person garey    schedule 11.03.2017    source источник
comment
Добавьте свою cometd.configure() часть.   -  person lin    schedule 11.03.2017
comment
Какой тип объекта $scope.messages? Где определяется его append метод?   -  person georgeawg    schedule 11.03.2017


Ответы (1)


Вам не нужно добавлять / удалять слушателей при разрыве соединения, как описано в документации по .

Слушатели добавляются, когда вы настраиваете приложение перед рукопожатием, и остаются там до тех пор, пока вы не удалите их явным образом. Возможно, вы захотите добавить / удалить слушателей в зависимости от логики вашего приложения, но не делайте этого - как вы говорите - чтобы справиться с тем фактом, что соединение разорвано - это не нужно и это ненужная работа с вашей стороны.

Подписчики должны быть добавлены в /meta/handshake успешный прослушиватель, что также описано в документации по ссылке выше. Это гарантирует, что подписчики автоматически удаляются и повторно добавляются CometD при повторном встряхивании - опять же, приложению не нужно что-либо делать.

Вы также хотите прочитать раздел о динамической повторной подписке.

Ведение журнала, о котором вы сообщаете из своего приложения, говорит о том, что в вашем приложении что-то не так: слушатель не должен удаляться и повторно добавляться, как показывают ваши журналы - это то, что делает ваше приложение, а не CometD.

Я рекомендую вам упростить свое приложение, следуя советам выше; скорее всего ваша проблема исчезнет.

person sbordet    schedule 11.03.2017