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")并且频道正常工作。