`
somefuture
  • 浏览: 1089963 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Play!2.1 的异步请求

阅读更多

这里介绍一下Play!2.1  的异步请求。

请一定注意:这仅仅适合于Play!2.1,其他版本几乎是不可能这样做的。所以如果你在用2.2,请自行查验官方文档。

=========================

异步请求需要用到 Promise<Result> 类。过程很简单,不需要什么注解,也不需要修改控制器方法的返回值类型。看一个例子:

public static Result index() {
  Promise<Integer> promiseOfInt = play.libs.Akka.future(
    new Callable<Integer>() {
      public Integer call() {
        return intensiveComputation();
      }
    }
  );
  return async(
    promiseOfInt.map(
      new Function<Integer,Result>() {
        public Result apply(Integer i) {
          return ok("Got result: " + i);
        } 
      }
    )
  );
}

 方法的定义依然遵守public static Result。2.2就不再是这样了,可以去看一下。

不同的是不再返回ok()或者banrequest()方法,而是async()方法。

这个方法接受一个Promise<B>类的map方法。

map方法返回的是<B> Promise<B>,它接受一个play.libs.F.Function<A, B>的实现类,将A映射为B。

A从哪里来的呢?就是上面那个Promise<B>的返回值中。

所以整个过程就是:

首先得到一个Promise类,通过Akka的future方法返回。形如

 

Promise<A> promise= play.libs.Akka.future(
    new Callable<A>() {
      public A call() {
        return new A();
      }
    }
  );

 然后在async中调用它的map方法:

 

 

return async(
    promise.map(
      new Function<A,B>() {
        public B apply(A i) {
          return new B();
        } 
      }
    )
  );

 由于我们的方法是控制器方法,需要返回Result,把B改成Result就行。

 

 

上面的代码要运行起来还很难,因为同名的类太多了,不知道怎么导入。这是相关的类:

 

import play.libs.F.Function;
import play.libs.F.Promise;
import play.libs.Akka;
import java.util.concurrent.Callable;

 

0
0
分享到:
评论
2 楼 somefuture 2013-12-02  
aunox 写道
Play!2.*和Play!1.*就是天翻地覆的变化啊!导致我们现在一直用着Play!1.*,不能进行有效的升级。

我以前没用过play。1.*好用吗,我不知道他们的差别。官网给出了升级指南,不知道有用吗?
1 楼 aunox 2013-12-02  
Play!2.*和Play!1.*就是天翻地覆的变化啊!导致我们现在一直用着Play!1.*,不能进行有效的升级。

相关推荐

    techsupport_ext4_scala:由 scala & play2.1 & extjs 4.2 重建的技术支持

    Play2.1是该项目采用的版本,提供了异步I/O和actors模型,这使得Web应用能更高效地处理请求。Play框架还内置了对JSON的支持,这对于构建RESTful API非常方便,从而可以轻松地与前端进行交互。 **ExtJS 4.2**: ExtJS...

    play框架学习手册

    在Play框架中,可以通过实现Job来处理异步任务。 7.2 BootstrapJob和ScheduledJob 了解BootstrapJob和ScheduledJob的不同用途以及如何直接调用Job。 **八HTTP异步编程** 8.1 挂起HTTP请求 掌握如何在Play框架中挂...

    play-crud-example

    "play-crud-example" 是一个基于 Play Framework 2.1.x 的示例项目,它主要用于演示如何在Java 1.6环境下实现基本的CRUD(创建、读取、更新、删除)操作。Play Framework 是一个现代、开源的Web应用框架,以Scala和...

    基于安卓Android招聘信息系统设计.rar

    - 发布上线:通过Google Play或其他第三方应用市场进行发布,供用户下载安装。 综上所述,基于安卓Android的招聘信息系统是一个结合了移动技术与人力资源管理的创新应用,旨在提升招聘效率,优化求职体验,为企业和...

    企业级Android开发全套教程.zip

    2.1 UI设计:讲解XML布局文件的编写,如线性布局、相对布局、约束布局等,以及自定义View的实现。 2.2 Activity与Intent:解释Activity的生命周期,Intent的种类及使用,如何实现界面间的跳转。 2.3 Service:阐述...

    android v4 jar包

    AsyncTask是一个轻量级的异步任务框架,适用于执行耗时操作,如网络请求或数据库操作,同时保持UI线程的响应性。它有三个泛型参数,分别代表后台操作类型、进度更新类型和结果类型。 **5. SharedPreferencesCompat*...

    Android高仿拉手网项目实战视频教程下载

    **2.1 布局规划** - **首页**:显示热门团购信息及分类导航。 - **分类页**:展示不同类别下的团购商品列表。 - **详情页**:提供团购商品的具体信息。 - **购物车**:用户可添加商品至购物车进行批量购买。 - **...

    基于android手机通-讯录的设计与实现设计本科学位论文.doc

    2.1 Android系统架构 Android是一个开源的移动操作系统,主要由Linux内核、系统库层、应用程序框架层以及应用程序四部分组成。Linux内核为Android提供了基本的硬件驱动支持和系统服务。系统库层包含了各种库,如...

    基于Android的茶叶智能购买app.pdf

    - **网络请求**:通过AsyncTask实现异步加载数据,避免阻塞UI线程。 - **错误处理**:设置异常捕获机制,对可能出现的问题进行有效处理。 - **性能优化**:定期对App进行性能检测与调优,提升用户体验。 通过上述...

    Android应用开发详解

    - **异步处理**:使用AsyncTask或其他库进行后台任务处理。 #### 2.4 多媒体应用开发 - **音频播放**:使用MediaPlayer类播放音频文件。 - **视频播放**:使用VideoView类播放视频文件。 - **摄像头**:调用Camera ...

    tp2-mobileapp:移动应用

    3.1 异步编程:在移动环境中,为了保持应用的流畅性,通常使用异步编程处理耗时操作,如网络请求和数据库操作。Java提供了IntentService、AsyncTask等机制来实现异步任务。 3.2 数据存储:Java配合SQLite数据库,...

    详解vuex的简单使用

    1. `actions.js`:用于处理异步操作,如数据请求。 2. `getters.js`:提供计算属性,用于从 state 中派生出新的可读状态。 3. `index.js`:整合其他模块,创建 Vuex store 实例。 4. `mutations.js`:定义状态的同步...

    Stackless_Python并发式编程介绍[已校对版].pdf

    协程提供了一种高效的并发编程手段,特别适合于那些需要大量并发执行的任务,例如网络请求处理、I/O操作等。 #### 4. 轻量级线程 Stackless Python中的轻量级线程(微进程)比传统操作系统级别的线程更加轻便。这...

    RTMP客户端:使用PHP 7+重写了RTMP客户端

    客户端发送“play”命令,订阅服务器上的指定流,然后接收并解码数据。 3.4 断线重连 为了应对网络不稳定,客户端需要实现断线检测和自动重连机制,确保数据传输的连续性。 四、PHP 7+的性能优化 4.1 引擎优化 ...

    C#全能速查宝典

    2.1.28 WindowState属性——窗体的窗口状态 151 2.2 文本类控件 152 2.2.1 AllowEdit属性——是否可以编辑列表项 152 2.2.2 AppendText方法——追加文本 152 2.2.3 BeginEdit方法——将单元格置于编辑模式下 153 ...

Global site tag (gtag.js) - Google Analytics