0

我知道这类问题经常出现,但我需要 JavaScript 中类似等待机制的帮助。我知道基于 setTimeout 的解决方案将会出现,但我不确定如何在我的情况下实现它。

我正在编写一个在内部使用 WebSocket 的 API。有一个 connect() 方法可以设置 WebSocket,我需要让它在设置 WebSocket 之后才返回。我希望它返回一个连接是否成功的值,但这不是主要问题。

我遇到的问题是,在用户调用 connect() 后,他们可能会调用另一个依赖 WebSocket 正确设置的方法。如果调用得太早,则会抛出一个错误,指出该对象不可用。

我当前的解决方案是在我确定连接成功并在每种方法中检查每种方法时设置一个“已连接”标志。如果它没有连接,我将方法调用添加到一个队列,该队列由设置标志的相同代码运行。这行得通,但它在我的方法中引入了这种代码风格,并且从用户的角度来看也似乎具有误导性,因为这些函数的调用被延迟了。此外,如果有其他用户代码依赖于这些调用在到达它们之前已完成,那么它的行为将不会像预期的那样。

我一直在绞尽脑汁思考如何处理这个案子。最简单的解决方案是找到一种方法来阻止从连接返回,直到设置 WebSocket 之后,但这并不是真正的 JavaScript 方式。另一种选择是让他们在回调中提供其余代码,但在这种情况下,这似乎是一件奇怪的事情。可能是我想多了?

编辑:为了更好地说明我的问题,以下是用户可以执行的操作示例:

var client = new Client(options);
client.connect();
client.getServerStatus();

getServerStatus() 方法将在内部使用 WebSocket。如果 WebSocket 尚未设置,用户将收到不可用错误。

4

3 回答 3

2

不幸的是,今天的 Javascript 并没有真正像那样工作。将来(ECMA6)可能会有新的语言特性更直接地解决这个问题。但是,目前您仍停留在当前接受的处理异步事件的方法中,该方法仅限于回调。您可能还想探索处理“回调地狱”的“承诺”,但是您需要一个库。

是的,到处都有回调似乎很奇怪,特别是对于 Web 编程的新手来说,但它确实是现阶段进行它的唯一方法(假设你想要一个跨浏览器友好的解决方案)。

于 2013-09-23T20:35:11.227 回答
0

“等待”几乎是您要寻找的关键字。实际上,它就是yield这样做的。参见例如MDN 的文档

于 2013-09-23T20:37:01.687 回答
0

有一个 connect() 方法可以设置 WebSocket,我需要让它在设置 WebSocket 之前不返回

除非您重写 javascript 执行引擎,否则这不会发生。

尝试发送数据的代码将需要检查套接字状态(我会将套接字封装在一个对象中,提供一种在打开/关闭事件上设置成员变量并从外部代码)。或者,您可以添加消息并回调到队列并在套接字连接时处理队列。

于 2013-09-23T21:00:31.763 回答