说到《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中设计完成的工作(非常)类似于多线程设计。