天天看點

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;      

繼續閱讀