Play framework处理异步结果

什么是异步结果?

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值