0

これは、擬似コードでの私の状況です。

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で実装しようとしていますが、一般的なソリューションは大歓迎です。

4

5 に答える 5

1

これに対する多くの良い解決策がありますが、コールバックを使用することをお勧めします。

メソッドが戻った後に何かをすることとは考えないでください。状態を報告したり、イベントをトリガーしたりするためにコールバックすることと考えてください。

イベントパターンを検索するか、Javaでコールバックします。これが私が見つけた1つのリンクです

委任パターンはに非常に似ています。

于 2010-11-29T17:06:30.150 に答える
0

最初に応答を送信してから、「if(playersConnected」チェックを実行する」ことはできませんか?

于 2010-11-29T17:04:30.727 に答える
0

ここにあるこのクロージャ構文についてはよくわかりません。代わりにこれをもらえますか?

function onRequest() {
    playersConnected++;

    sendResponse(OK);

    if (playersConnected == 4) {
        sendAllPlayersTheirCards()
    }
}
于 2010-11-29T17:04:52.850 に答える
0

これは関連するチュートリアルのようです:

Callableを使用してRunnableから結果を返す

于 2010-11-29T17:07:54.597 に答える
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();
}
于 2010-11-29T23:12:25.270 に答える