Play!2.1 的异步请求-阿里云开发者社区

开发者社区> 人工智能> 正文

Play!2.1 的异步请求

简介: 这里介绍一下Play!2.1  的异步请求。 请一定注意:这仅仅适合于Play!2.1,其他版本几乎是不可能这样做的。所以如果你在用2.2,请自行查验官方文档。 ========================= 异步请求需要用到 Promise 类。

这里介绍一下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;

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
人工智能
使用钉钉扫一扫加入圈子
+ 订阅

了解行业+人工智能最先进的技术和实践,参与行业+人工智能实践项目

其他文章