【发布时间】:2017-01-08 08:25:54
【问题描述】:
我正在尝试使用 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);
}
【问题讨论】:
标签: google-app-engine channel-api