Play framework处理异步结果

来源:互联网 发布:js高级函数 编辑:程序博客网 时间:2024/06/02 05:38

什么是异步结果?

到现在为止,我们已经能够将计算结果直接发送到Web客户机了。情况并非总是如此,结果可能取决于结果的计算或长Web服务调用。


因为Play工作的方式,Action代码必须尽可能的快,那么,如果我们还不能计算结果,我们应该从action中返回什么呢?我们应该返回一个结果的承诺。

一个 Promise<Result>最终将以类型结果的值返回,使用Promise<Result>代替通用的Result,我们可以迅速的从我们的Action中返回而不做任何的阻塞,Play承诺兑现后,立即为结果服务。


在等待响应时,Web客户机将被阻塞,但服务器上不会阻塞任何东西,服务器资源可用于服务其他客户机。


如何创建Promise<Result>

创建一个Promise<Result>我们首先需要另外一个承诺,这个承诺会给我们计算结果所需的实际价值:

Promise<Double> promiseOfPIValue = computePIAsynchronously();Promise<Result> promiseOfResult = promiseOfPIValue.map(  new Function<Double,Result>() {    public Result apply(Double pi) {      return ok("PI value computed: " + pi);    }  });
注意:在使用java编写功能成分此刻是非常复杂的,但应该更好时,java支持lambda符号。


Java异步API给你提供了一个Promise,这种情况是当你正在使用play.libs.ws API调用外部Web服务,或者如果你是使用Akka 进行异步任务调度任务或者与actor沟通使用play.libs.Akka.。

一个简单的方法去执行一个异步代码块和获得承诺去使用promise()帮助者。

Promise<Integer> promiseOfInt = Promise.promise(  new Function0<Integer>() {    public Integer apply() {      return intensiveComputation();    }  });
到现在为止,我们一直在返回结果。要发送异步结果,我们的操作需要返回一个Promise<Result>.

public static Promise<Result> index() {  Promise<Integer> promiseOfInt = Promise.promise(    new Function0<Integer>() {      public Integer apply() {        return intensiveComputation();      }    }  );  return promiseOfInt.map(      new Function<Integer, Result>() {        public Result apply(Integer i) {          return ok("Got result: " + i);        }       }    );}

原创粉丝点击