0

在我的 ExtJS 4.1 应用程序中,我使用 websocket 连接从服务器远程实例化和控制 ExtJS 类。客户端注册到 websocket.onmessage 并等待传入​​命令。

我为此定义了一个简单的协议。服务器发送一个“CREATE classname id”。在客户端,我使用 Ext.create 来实例化该类。然后服务器可以通过 websocket 向对象发送命令。例如“DOSTUFF id”。我正在使用 ExtJS 的动态加载机制。

在 Chrome 中一切正常。

Firefox 的问题是,第二条命令消息 (DOSTUFF) 在对象创建之前执行。这会导致错误,因为找不到对象。似乎第二个 websocket 命令消息是在 ExtJS 通过 HTTP-GET 加载文件之前执行的。

在我的世界中,JavaScript 是按顺序执行的(我不使用 webworkers)。我认为 Ext.create(..) 的调用应该与后台的 HTTP-GET 同步执行,不是吗?

这是我的客户端应用程序的“伪”跟踪输出:

ExecuteCommand (Enter): CREATE ("MyClass", "1")
HTTP-GET "MyClass.js"
ExecuteCommand (Enter): DOSTUFF ("1")
ExecuteCommand (Error): DOSTUFF ("1"): Object not found
ExecuteCommand (Enter): CREATE ("MyClass", "1"): OK! Object created!
4

2 回答 2

1

这说得通。默认情况下,GET 请求是异步的,请参阅 Firefox 文档:https ://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Synchronous_and_Asynchronous_Requests

为避免此问题,请检查对象是否存在,如果需要让服务器知道在几秒钟内重新发送,然后重复。

于 2012-08-20T22:17:23.493 回答
0

好的,正如 DmitryB 所提到的,HTTP-GET 异步工作。在发送 XMLHttpRequest 后,将控制权传递给下一个 websocket.onmessage。

在调用 Ext.create 之前,我通过使用带有回调函数的 Ext.require 解决了这个问题。

它看起来像这样:

ExecuteCommand: CREATE ("MyClass", "1")
       Ext.require("MyClass", function(c) { 
            ExecuteCommand: DOSTUFF (c);
       }
于 2012-08-21T06:34:29.620 回答