GWT - 如何在收到响应后从RequestBuilder返回String值?

时间:2017-07-27 20:08:45

标签: java string gwt callback

我无法弄清楚如何在收到响应后从RequestBuilder的sendRequest()方法返回String值。我提到similar question,建议使用Callback<String, String> callback,但我无法弄清楚如何实现这一点。 Callback的{​​{3}}没有任何示例。

我所拥有的是具有Requester方法的类generateRequest(),它应该使用RequestBuilder发出请求并在调用时返回String。 processResponse()方法获取响应,解析它并返回我存储在output中的String。当从另一个类调用output时,如何返回此generateRequest()字符串?

public String generateRequest() {
        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(url.getUrl()));
        builder.setHeader("Authorization", authHeader);
        String title = null;

        try {
            builder.sendRequest(null, new RequestCallback() {

                public void onError(Request request, Throwable exception) {
                    GWT.log(exception.getMessage());
                }

                public void onResponseReceived(Request request, Response response) {
                    String output = processResponse(response);
                }
            });
        } catch (RequestException e) {
            GWT.log(e.getMessage());
        }

    return title;
}

2 个答案:

答案 0 :(得分:2)

我认为你可能会误解某些东西。

您不能简单地返回一个String,因为该调用是异步的(即您无法返回String,因为在您希望返回时,String尚未可用)。 你可以简单地等到那里,直到通话结果准备就绪,但这是非常糟糕的做法;这就是为什么你会看到人们提出回调的原因。

答案 1 :(得分:1)

想象一下,这是代码:

statement01;
statement02;
String result = generateRequest(...);
statement04UsingResult;
statement05;

然后这将无效,因为在执行statement04UsingResult之前结果将不可用。请求尚未完成。 (正如Andrej已经提到的那样)

要解决此问题,请拆分代码:

statement01;
statement02;
generateRequest(...);

创建一个新的void方法,它接受结果作为参数:

public void newMethod(String result) {
    statement04UsingResult;
    statement05;
}

并从onResponseRevieve - 方法内部调用:

           builder.sendRequest(null, new RequestCallback() {

            public void onError(Request request, Throwable exception) {
                GWT.log(exception.getMessage());
            }

            public void onResponseReceived(Request request, Response response) {
                newMethod(processResponse(response));
            }
        });

希望有所帮助。