Я пытаюсь использовать Channel API для отправки обновлений с сервера на клиент. Поток состоит в том, что пользователь нажимает кнопку, которая запускает действие на стороне сервера, которое генерирует множество журналов. Я хочу отображать журналы пользователю «в реальном времени».
Когда я впервые загружаю страницу, я получаю все сообщения, без проблем. Если я активирую действие во второй раз, не обновляя страницу в моем браузере, все сообщения появляются дважды. Вот настроенная часть канала, привязанная к событию onLoad страницы. С полученными журналами консоли я понял, что метод onMessage () вызывается более одного раза, когда страница не обновляется. Похоже, мне нужно каким-то образом «убить» более ранние сокеты, но я не мог найти способ в официальной документации. Может ли кто-нибудь указать мне правильное направление, чтобы избавиться от ложных сообщений?
// First fetch a token for the async communication channel and
// create the socket
$.post("/app/channels", {'op':'fetch', 'id' : nonce},
function (data, status, xhr) {
if (status == "success") {
data = JSON.parse(data);
token = data["token"];
console.log("Cookie: " + get_mp_did() + "; token: " + token);
var channel = new goog.appengine.Channel(token);
var handler = {
'onopen': onOpened,
'onmessage': onMessage,
'onerror': function() {
$("#cmd_output").append('Channel error.<br/>');
},
'onclose': function() {
$("#cmd_output").append('The end.<br/>');
$.post("/app/channels", {'op':'clear'});
}
};
var socket = channel.open(handler);
socket.onopen = onOpened;
socket.onmessage = onMessage;
}
});
onOpened = function() {
$("#cmd_output").empty();
};
onMessage = function(data) {
message = JSON.parse(data.data)['message'];
$("#cmd_output").append(message);
console.log('Got this sucker: ' + message);
}