防止返回直到满足条件

时间:2013-09-23 20:19:44

标签: javascript

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

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

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

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

我一直在绞尽脑汁处理这个案子。最简单的解决方案是找到阻止从连接返回的方法,直到建立WebSocket之后,但这不是JavaScript方式。另一种选择是让它们在回调中提供其余的代码,但在这种情况下,这似乎是一件奇怪的事情。也许我过度思考了?

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

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

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

3 个答案:

答案 0 :(得分:2)

今天的Javascript实际上并不像那样。将来(ECMA6)可能会有更新的语言功能更直接地解决这个问题。但是现在你仍然坚持使用当前接受的处理异步事件的方法,这种方法仅限于回调。您可能还想探索“承诺”来处理“回调地狱”,但是你需要一个库。

是的,到处都有回调似乎很奇怪,特别是对于刚接触网络编程的人来说,但是在这个阶段它真的是唯一的方法(假设你想要一个跨浏览器友好的解决方案)。

答案 1 :(得分:0)

“等待”几乎是您要查找的关键字。实际上,这是yield。参见例如MDN's documentation

答案 2 :(得分:0)

  

有一个设置WebSocket的connect()方法,我需要让它在WebSocket建立之后才能返回

除非你重写javascript执行引擎,否则不会发生这种情况。

尝试发送数据的代码都需要检查套接字状态(我将套接字封装在一个对象中,提供一个方法,在open / close事件上设置成员变量并轮询该状态来自外部代码的成员变量)。或者,您可以向队列添加消息和回调,并在套接字连接时处理队列。