Сделайте что-нибудь после возврата метода - PullRequest
0 голосов
/ 29 ноября 2010

Это моя ситуация в псевдокоде:

function onRequest() {
    receiveConnectionRequest();

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

    sendResponse(response);

}

Когда игроки 1-3 подключаются, они добавляются в список игроков, и им возвращается OK, после чего они настраивают материал наих сторона.Однако, когда игрок 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, но приветствуются общие решения.

Ответы [ 5 ]

1 голос
/ 29 ноября 2010

Много хороших решений для этого, но я бы предложил использовать обратный звонок.

Не думайте, что после выполнения метода что-то делается, думайте, что он перезванивает, чтобы сообщить о состоянии или вызвать событие.

Поиск шаблона события или обратного вызова в Java. Вот одна ссылка, которую я нашел .

Шаблон делегирования очень похож на.

0 голосов
/ 30 ноября 2010

Я мог бы сделать это так:

function onRequest(request) {

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

}

class game
function handleRequest(request, sendResponse:Function) {
 players++;
 sendResponse(OK);
 if (players == 4) sendCards();
}
0 голосов
/ 29 ноября 2010

Это похоже на соответствующее руководство:

Использование Callable для возврата результатов из Runnables

0 голосов
/ 29 ноября 2010

Я не уверен насчет этого синтаксиса замыкания, который у вас здесь.Вы можете просто взять это вместо этого?

function onRequest() {
    playersConnected++;

    sendResponse(OK);

    if (playersConnected == 4) {
        sendAllPlayersTheirCards()
    }
}
0 голосов
/ 29 ноября 2010

Не можете ли вы сначала отправить ответ, а затем выполнить проверку if (PlayersConnected) после?

...