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