0

我从 Play!Framework 世界进入 GWT 应用程序。

我需要从我的 GWT 服务器调用 HTTP 响应。

在 Play!Framework 1 中,我会简单地“等待”一个 WS.get.async 结果

Promise<HttpResponse> futureResponse = WS.url(
    "http://www.google.com"
).getAsync();
await(futureResponse); 

在 play!framework2 中,我只是返回一个异步响应。

return async(
    WS.url(feedUrl).get().map(
    new Function<WS.Response, Result>() {
        public Result apply(WS.Response response) {
            return ok("Feed title:" + response.asJson().findPath("title"));
        }
    }
)
);

两个代码片段都来自 Play!Framework 的文档。

如何在 GWT 后端实现相同的结果?

4

4 回答 4

1

GWT 没有 Promises,但您可以使用gwtquery,除了其他功能之外,它还具有基于Promises/A+的Promises 实现

编辑:请注意,GWT 是以客户端为中心的,因此这种方法仅适用于浏览器 js 运行时。

你的例子可以这样写:

import static com.google.gwt.query.client.GQuery.*;
import com.google.gwt.query.client.*;

  // Using $$ to create a jso with the parameters for the ajax method
  // You can though use Settings.create() to use a java builder instead.
  Promise gettingInfo = ajax($$("url: rest_service.js, type: post, dataType: json, data: {foo: bar}"));

  // You can use the promise as many times as you need it, 
  // it would always maintain the status and server data.
  gettingInfo.done(new Function(){public void f() {
    Properties jsonResponse = arguments(0);
    Window.alert("Feed title:" + jsonResponse.get("title"));
  }});

请注意,GQuery 方法会为某些方法(ajax、动画等)返回一个 Promise。

在这个响应中有另一个使用 gquery 承诺的代码示例。

于 2013-07-30T12:37:41.697 回答
1

没有什么能比得上“GWT 服务器”或“GWT 后端”。如果你使用 GWT-RPC 或 RequestFactory,它都是基于 servlet 的,不支持异步处理;而 GWT 只提供处理客户端请求的手段,您在服务器端做什么完全取决于您,并且玩 Java(假设 GWT-RPC 或 RequestFactory,以及它们的内置实现)。

如果您有一个返回 a java.util.concurrent.Future(或等效的)的 HTTP 客户端库,那么您可以return theFuture.get();等待 HTTP 请求完成。

Java 中的大多数 HTTP 客户端库都是同步的(阻塞),因此您甚至不需要考虑异步性。如果您想同时执行多项操作,一些库可以异步工作,但许多(如果不是大多数)使用回调而不是返回 in Future。然后你可以使用锁来等待完成,或者使用像 Guava 之类的东西SettableFuture(从回调中设置它的值,在需要时获取它的值,它会阻塞直到值被设置)


注意:大多数(如果不是全部)其他答案涉及客户端代码,而不是您询问的服务器端代码。

于 2013-07-30T16:09:47.283 回答
0

在 GWT 中,您需要大量样板代码来执行异步服务器端调用,与 Play 相比,GWT 中的哲学非常不同

你唯一能做的就是:

myServiceAsync.myService(myRequest, new AsyncCallBack<myResponse>(){
    onSuccess(MyResponse response){
      // do your stuff
    }
    onFailure(Throwable e){...}
}

为此,您需要很多东西:

  1. 实现您的服务的 RemoteServlet(第 2 点的同步接口)
  2. 两个接口一个同步另一个异步
  3. 客户端上同步服务的实例化,返回服务的异步版本

希望它有助于 GWT 主页的进一步解释:http: //www.gwtproject.org/doc/latest/DevGuideServerCommunication.html

于 2013-07-30T13:23:26.560 回答
0

你可以使用 GWTP https://code.google.com/p/gwt-platform/ 它有一个简单的调度,带有易于使用的动作响应元组。示例:https ://github.com/ArcBees/GWTP/wiki/RPC-Dispatch

该代码来自 GWT-Dispatch:https ://code.google.com/p/gwt-dispatch/ 如果您不想使用完整的 MVP 框架,这也是一种替代方法。

于 2013-07-30T13:45:01.620 回答