有没有办法让Action
可以返回Result
或Promise<Result>
?
该方案基于请求(参数和标头),操作决定是否返回简单的Result
,或者它需要向另一个服务发出http请求,然后才返回结果,所以使用Promise<Result>
。
路线:
GET /dosomething controllers.MyController.doSomething()
的java:
public static Result doSomething() {
Request request = request();
if (...) {
return getData();
} else {
return ok(...);
}
}
private static Promise<Result> getData() {
...
}
问题是,如果Action
返回一个(在它的签名中),那么我就无法返回另一个......
关于如何解决这个问题的任何想法?
答案 0 :(得分:4)
正如评论中所提到的,最简单的方法是始终返回Promise,并使用已完成的Promise包装非异步操作。要将值包装在已完成的promise中,只需使用静态pure
方法:
public static Promise<Result> doSomethingAsync() {
if (...) {
return getData();
} else {
return F.Promise.pure(ok(...));
}
}
答案 1 :(得分:1)
这远不是一个最佳的解决方案,但似乎可以解决这个问题,我将其作为答案添加,以防其他人在将来寻找解决方案。
如果您对如何处理这种情况有另一种想法,我很想知道!
根据@MariusSoutier的建议,我创建了这个方法:
public static F.Promise<Result> wrapResultAsPromise(final Result result) {
return F.Promise.promise(
new F.Function0<Result>() {
public Result apply() {
return result;
}
}
);
}
然后,如果Action
有一个需要返回承诺的场景,那么所有返回的结果都将被包装为承诺。