什么是异步结果?
到现在为止,我们已经能够将计算结果直接发送到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);
}
}
);
}