1

GWT に異常な問題があります。プロジェクトをコンパイルした後、ブラウザーで .html ファイルを開いて実行します。次のコード行が表示されるまで、正常に動作しています。

public static ClickHandler addBoardButtonHandler(final String name) {
    return new ClickHandler(){

        @Override
        public void onClick(ClickEvent event) {
            Window.alert("We will retrieve them!"); //this line runs
            String boardSTickets = getBoardSTickets(name); // this too
            Window.alert("We got tickets!"); // the code is never executing this line
            String boardSSwimlanes = getBoardSSwimlanes(name);
            Window.alert("We got swimlanes!");
            KanbanizerClient.showSingleBoard(boardSTickets, boardSSwimlanes);
        }

    };
}

このメソッドは、次の別のメソッドによって呼び出されます。

private static Button addBoardButton(String name) {
    Button button = new Button(name);
    button.addClickHandler(HandlerManager.addBoardButtonHandler(name));
    return button;
}

これも適切に実行されています。getBoardSTickets() メソッドは次のとおりです。

protected static String getBoardSTickets(String name) {
    final List<String> ticketsJSON = new LinkedList<String>();  
    try {
            Request request = Builder.createBuilder(RequestBuilder.GET, "http://localhost:8080/Kanbanizer/boards/" + name + "/tickets").sendRequest(null, new RequestCallback(){

                @Override
                public void onResponseReceived(Request request,
                        Response response) {
                    if(response.getStatusCode() == 200){
                        ticketsJSON.add(response.getText());
                    }

                }

                @Override
                public void onError(Request request, Throwable exception) {
                    // TODO Auto-generated method stub

                }

            });
        } catch (RequestException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    return ticketsJSON.get(0);
}

ありがとうございました :)

4

1 に答える 1

2

GWT コンテキストで ajax を理解するには - https://developers.google.com/web-toolkit/doc/latest/tutorial/clientserverの「Making Asynchronous Call」セクションをお読みください。

非同期リクエスト呼び出しの実行後に文字列を返すメソッドとしての getBoardSTickets() のプログラミングに欠陥があります。getBoardSTickets() で非同期呼び出しの結果を返そうとしないでください。

return ticketsJSON.get(0);の直後に呼び出されsendRequest()ます。RequestCallback() が処理を完了していないため、 ticketJSON のエントリがゼロであるため、例外がスローされます。

外部からコールバックを渡してみる

protected static String getBoardSTickets(String name,  RequestCallback callback){
      //Code for making request
}

呼び出しコードは次のように変更する必要があります

getBoardSTickets(name, new RequestCallback(){
  //onSuccess and onFailure handling.
} )

server への非同期呼び出しを呼び出すすべてのメソッドに同じロジックが当てはまります。メソッドから要求応答の値を返すようにプログラムしないでください。

于 2013-03-24T16:12:06.403 に答える