2010-11-29 35 views
0

Ceci est ma situation pseudocode:faire quelque chose après la méthode retourne

function onRequest() { 
    receiveConnectionRequest(); 

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

    sendResponse(response); 

} 

Lorsque les joueurs 1-3 de connexion, ils sont ajoutés à la liste des joueurs et OK est leur retour, à quel point ils fixeront des trucs de leur côté. Lorsque le joueur 4 se connecte, cependant, avant que la réponse à sa demande ne soit envoyée, tous les joueurs reçoivent leurs cartes. Comme le joueur 4 n'a pas encore reçu de réponse à sa demande, il n'a pas encore été correctement initialisé et des erreurs ont été commises lors de la réception de ses cartes.

Ce que je voudrais avoir est la suivante:

function onRequest() { 
    receiveConnectionRequest(); 

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

    sendResponse(response); 

    executePlanned() // now cards are sent 
} 

Y at-il un modèle général pour cela? La fonction onConnect est dans une classe différente et ne doit pas être consciente des détails d'implémentation de onRequest.

J'essaie spécifiquement de l'implémenter en Java, mais les solutions génériques sont les bienvenues.

+0

On dirait délégation. plan() est ici la configuration de la délégation et executePlanned() appelle les actions en file d'attente. – Sorpigal

Répondre

1

Beaucoup de bonnes solutions à cela, mais je suggère d'utiliser un appel.

ne pensez pas comme faire quelque chose après le retour de la méthode, penser comme rappeler à signaler un état ou déclencher une événement

Recherchez le modèle d'événement ou les rappels en Java. Voici one link I found. Le delegation pattern est très similaire à.

0

Pouvez-vous pas envoyer la réponse d'abord, puis faire le « si (playersConnected » après le check?

+0

Dans ma configuration actuelle, la réponse doit être retournée par la fonction qui vérifie si tous les joueurs sont connectés –

0

Je ne suis pas sûr de cette syntaxe de fermeture que vous avez ici. Vous pouvez avoir tout cela à la place?

function onRequest() { 
    playersConnected++; 

    sendResponse(OK); 

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

Je ne peux pas car le code qui gère la réception de la requête et l'envoi de la réponse fait partie d'un paquet générique, et le code qui fait playersConnected ++ fait partie d'un autre paquet, spécifique au jeu. –

0

je pourrais le faire comme ceci:

function onRequest(request) { 

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

} 

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