什么时候我应该使用承诺



说到《Play’s Promises》,我还是有点迷茫。在Play文档中,它说:

默认配置针对异步控制器进行了调优。换句话说,应用程序代码应该避免在控制器中阻塞,即让控制器代码等待操作。此类阻塞操作的常见示例包括JDBC调用、流API、HTTP请求和长时间计算。

那么我应该为我所做的每个JDBC调用使用Promise吗?这基本上意味着在几乎每个操作中都使用承诺,因为它们都以某种方式使用数据库。对吧?

是。promise对于有一个专门用于控制器的线程(它的重要性非常高)做"好的"工作是非常有用的:一个不昂贵的工作和/或与控制器工作相关的工作。

换句话说,就是绑定表单等,以及管理承诺。但是不要做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中设计完成的工作(非常)类似于多线程设计。

最新更新