2010-11-29 59 views
0

后,这是我在伪情况:做一些方法返回

function onRequest() { 
    receiveConnectionRequest(); 

    response = function onConnect() { 
     playersConnected++; 
     if (playersConnected == 4) { 
      sendAllPlayersTheirCards() 
     } 
     return OK; 
    }(); 

    sendResponse(response); 

} 

当玩家1-3连接,它们会加入到玩家的列表,并确定被归还给他们,在这一点上,他们将设置填补他们的一面。然而,当玩家4连接时,在发送对他的请求的响应之前,所有玩家都被发送他们的卡。因为玩家4还没有收到他的请求的回应,所以他还没有正确地初始化并且在收到他的卡时出错。

我想有是这样的:

function onRequest() { 
    receiveConnectionRequest(); 

    response = function onConnect() { 
     playersConnected++; 
     if (playersConnected == 4) { 
      plan(sendAllPlayersTheirCards()) 
     } 
     return OK; 
    }(); 

    sendResponse(response); 

    executePlanned() // now cards are sent 
} 

是否有一个通用的模式是什么? onConnect函数位于不同的类中,不应该知道onRequest的实现细节。

我特意试图在Java中实现这一点,但通用的解决方案是值得欢迎的。

+0

貌似代表团。 plan()在这里设置委托,executePlanned()调用排队的动作。 – Sorpigal 2010-11-29 17:06:37

回答

1

许多优秀的解决方案,但我会建议使用回呼。

不要把它想成方法返回后做的事情,把它当做回调报告的状态或触发事件

搜索事件模式或使用Java回调。这里是one link I found

delegation pattern是非常相似。

0

你能不能先发响应,然后做了“如果(playersConnected”之后?

+0

在我当前的设置中,响应必须由检查所有播放器是否连接的函数返回 – 2010-11-29 23:14:02

0

我不知道你这里有这个闭合的语法检查,你能只有这个呢?

这个
function onRequest() { 
    playersConnected++; 

    sendResponse(OK); 

    if (playersConnected == 4) { 
     sendAllPlayersTheirCards() 
    } 
} 
+0

我不能,因为处理接收请求和发送响应的代码是通用包的一部分,而PlayersConnected ++的代码是另一个特定于游戏的软件包的一部分。 – 2010-11-29 23:08:29

0

我能做到这一点是这样的:

function onRequest(request) { 

game.handleRequest(request, function(response) { 
    sendResponse(response); 
} 

} 

class game 
function handleRequest(request, sendResponse:Function) { 
players++; 
sendResponse(OK); 
if (players == 4) sendCards(); 
}