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;

 

猜你喜欢

转载自somefuture.iteye.com/blog/1983621