Channel APIを使用して、サーバーからクライアントに更新をプッシュしようとしています。このフローは、ユーザがボタンを押して、多くのログを生成するサーバ側のアクションを引き起こします。私はユーザーにログを "リアルタイムで"表示したいと思います。AppEngineチャネルAPI:クライアント側メッセージの複製
最初にページを読み込むと、すべてのメッセージが表示されますが問題ありません。ブラウザでページを更新せずにもう一度操作を実行すると、すべてのメッセージが2回表示されます。ページ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);
}
実際には、(a)$ .post()はjquery onLoad()の後にクライアント側で一度実行されます。 (b)特に、ユーザーがボタンを押すたびに新しいチャンネルが作成されることはありません。 (c)トークンとIDをサーバ側に保存し、トークンがあればそれを再送する(d)メッセージを送信するとき、私はただ1つのトークンにしか送信しないので、メッセージが複数のチャネルに流れる方法を困惑させる。 しかし、リロードせずにボタンが押された時、メッセージは掛け算されます。言い換えれば、私はそうであってはならない何かを見ている。おそらくそれはいくつかのばかげたバグです...私に調査させてください – Karra
問題をデバッグした後、チャンネルAPIには何も関係ないことが判明しました。すべての呼び出しで、私はロガーにハンドラーを追加するだけで、ページを再ロードせずに積み重なっていました。しかし、この問題がChannels APIの問題のために見られた場合、チェックする必要があるすべてのものがあるため、Aniの答えを正しい答えとして受け入れています – Karra