Google AppEngine 通道已打开,客户端正在接收响应,但未调用 socket.onmessage
Google AppEngine channel is opened, client is receiving responses, but socket.onmessage is not being called
我有一个要使用 google app engine channel API 的网页。我有一个使用外部库生成的令牌,它被输入到这个非常非常简单的 javascript.
<html lang="en">
<body>
<script src="jquery-1.6.3.min.js" ></script>
<script type="text/javascript" src="/_ah/channel/jsapi"></script>
<script type="text/javascript">
var token, channel, socket;
var onOpened = function() {
document.body.innerHTML += "<br>Open!";
};
var onMessage = function(msg) {
document.body.innerHTML += "<br>Message: " + msg;
};
var onChannelError = function(error) {
document.body.innerHTML += "<br>Error! :'("
};
var onClose = function(e) {
document.body.innerHTML += "<br>Close :(";
};
var handler = {
onopen: onOpened,
onmessage: onMessage,
onerror: onChannelError,
onclose: onClose
};
var openChannel = function(t) {
token = t;
channel = new goog.appengine.Channel(token);
socket = channel.open(handler);
};
</script>
</body>
</html>
当我 运行 此代码(使用我的频道令牌调用 openChannel)时,将调用 onOpen 方法(因此 HTML 更改为 "Open!"。我的 var 套接字结束了看起来像这样:
rf {readyState: 1, cc: Array[0], onopen: function, onmessage: function, onerror: function…}
而且,当我查看 ChromeInspector 的网络日志时,在通道打开后,我可以看到浏览器现在成功地进行了长轮询(不确定这是不是正确的术语)talkgadget.google.com。作为回应,它得到了看起来非常好的回应。在大多数回复中,我得到了很多数字、括号和 ["noop"]。如果我在服务器中手动触发通知,我的客户端会在其请求中收到通知信息!但是我的 socket.onmessage 仍然没有被调用!
这是当时我的网络选项卡的屏幕截图。
手动调用 socket.onmessage({}) 将 DOM 更改为 "Message: [object Object]",因此我的处理程序似乎没有问题。无论如何,那里都有一个断点以防万一。如果我调用 socket.close(),我的 onClose 函数也会正确调用。
这让我抓狂,非常感谢您给我的任何帮助或建议!
我们也一直在使用它并遇到了同样的问题,这个解决方法似乎对我们很有效,在创建套接字后分配 onmessage:
channel = new goog.appengine.Channel(token);
socket = channel.open();
socket.onmessage = onMessage;
我与 Google 讨论了我遇到的问题。根据他们的说法,出现问题是因为在我的应用程序中,每当我与频道交互时,我都会修改 DOM 。无论出于何种原因,这导致通道插入的 iframe 小工具无声地中断。所以我删除了 DOM 操作(即 innerHTML += "Opened Channel"
)并且频道正常工作。
我有一个要使用 google app engine channel API 的网页。我有一个使用外部库生成的令牌,它被输入到这个非常非常简单的 javascript.
<html lang="en">
<body>
<script src="jquery-1.6.3.min.js" ></script>
<script type="text/javascript" src="/_ah/channel/jsapi"></script>
<script type="text/javascript">
var token, channel, socket;
var onOpened = function() {
document.body.innerHTML += "<br>Open!";
};
var onMessage = function(msg) {
document.body.innerHTML += "<br>Message: " + msg;
};
var onChannelError = function(error) {
document.body.innerHTML += "<br>Error! :'("
};
var onClose = function(e) {
document.body.innerHTML += "<br>Close :(";
};
var handler = {
onopen: onOpened,
onmessage: onMessage,
onerror: onChannelError,
onclose: onClose
};
var openChannel = function(t) {
token = t;
channel = new goog.appengine.Channel(token);
socket = channel.open(handler);
};
</script>
</body>
</html>
当我 运行 此代码(使用我的频道令牌调用 openChannel)时,将调用 onOpen 方法(因此 HTML 更改为 "Open!"。我的 var 套接字结束了看起来像这样:
rf {readyState: 1, cc: Array[0], onopen: function, onmessage: function, onerror: function…}
而且,当我查看 ChromeInspector 的网络日志时,在通道打开后,我可以看到浏览器现在成功地进行了长轮询(不确定这是不是正确的术语)talkgadget.google.com。作为回应,它得到了看起来非常好的回应。在大多数回复中,我得到了很多数字、括号和 ["noop"]。如果我在服务器中手动触发通知,我的客户端会在其请求中收到通知信息!但是我的 socket.onmessage 仍然没有被调用!
这是当时我的网络选项卡的屏幕截图。
手动调用 socket.onmessage({}) 将 DOM 更改为 "Message: [object Object]",因此我的处理程序似乎没有问题。无论如何,那里都有一个断点以防万一。如果我调用 socket.close(),我的 onClose 函数也会正确调用。
这让我抓狂,非常感谢您给我的任何帮助或建议!
我们也一直在使用它并遇到了同样的问题,这个解决方法似乎对我们很有效,在创建套接字后分配 onmessage:
channel = new goog.appengine.Channel(token);
socket = channel.open();
socket.onmessage = onMessage;
我与 Google 讨论了我遇到的问题。根据他们的说法,出现问题是因为在我的应用程序中,每当我与频道交互时,我都会修改 DOM 。无论出于何种原因,这导致通道插入的 iframe 小工具无声地中断。所以我删除了 DOM 操作(即 innerHTML += "Opened Channel"
)并且频道正常工作。