這裡介紹一下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;