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