GWT - 如何在收到响应后 return 来自 RequestBuilder 的字符串值?

GWT - How to return a String value from RequestBuilder after receiving a response?

我无法弄清楚如何在收到响应后从 RequestBuilder 的 sendRequest() 方法中 return 一个字符串值。我参考了一个 similar question where the suggestion was to use Callback<String, String> callback but I can't figure out how to implement this. The GWT documentation for Callback 没有任何例子。

我有一个 class Requester 方法 generateRequest() 应该使用 RequestBuilder 发出请求,return 调用时是一个字符串。 processResponse() 方法获取响应,对其进行解析,然后 return 是一个我存储在 output 中的字符串。当从另一个 class 调用 generateRequest() 时,我如何 return 这个 output 字符串?

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;
}

我想你可能误会了什么。

您不能简单地 return 字符串,因为调用是异步的(即您不能 return 字符串,因为在您希望 return 它)。 你可以简单地等待直到调用结果准备好,但这是非常糟糕的做法;这就是为什么你看到人们建议回调。

想象一下,这是代码:

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

那么这将不起作用,因为在执行 statement04UsingResult 之前结果将不可用。请求尚未完成。 (正如安德烈已经提到的)

要解决这个问题,请拆分您的代码:

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));
            }
        });

希望对您有所帮助。