我什么时候应该使用Promises?

时间:2015-05-23 17:34:28

标签: playframework-2.0

当谈到Play的承诺时,我仍然有点迷失。在Play documentation中它说:

  

默认配置针对异步控制器进行了调整。换句话说,应用程序代码应避免在控制器中阻塞,即使控制器代码等待操作。这种阻塞操作的常见示例是JDBC调用,流API,HTTP请求和长计算。

我应该为每个JDBC调用使用Promise吗?这几乎意味着在几乎每个动作中使用一个promise,因为它们都以某种方式使用数据库。正确?

1 个答案:

答案 0 :(得分:0)

是。 Promise非常有用,可以让一个专用于你的控制器的线程(它的重要性非常高)做好了#34;好的"工作:工作并不昂贵和/或与控制器工作有关。

换句话说,绑定表格等,并管理Promises。但是没有做jdbc调用(锁发生得这么快)。

Controller类中的示例:

public static F.Promise<Result> doControllerWork() {
    return F.Promise.promise(
             () -> doBusinessWorkAndReturnSomething())
           .map(
             (returnedValue) -> ok(views...render(returnedValue))),
           );
}

public static ReturnType doBusinessWorkAndReturnSomething(){
   ...
   return something;
}

编辑1:

如果你必须按顺序管理几个Promise:

public static F.Promise<Result> doControllerWork() {
    return F.Promise.sequence(
               F.Promise.promise(() -> doSomething1()),
               F.Promise.promise(() -> doSomething2()),
           ).map((returnList) -> {
                   ReturnType1 returnedElement1 = retrieveElement1(returnList);
                   ReturnType2 returnedElement2 = retrieveElement2(returnList);

                   return ok(views...(returnedElement1,returnedElement2));
           });
}

public ReturnType1 retrieveElement1(List<Serializable> returnList){
   int index = ...;
   // find by type using instanceOf, etc..
   return (ReturnType1) returnList.get(index);
}

在每个Promise中完成的工作与(非常)类似于多线程设计。