返回Result或Promise <result> </result>的操作

时间:2014-03-26 13:42:14

标签: java playframework playframework-2.0

有没有办法让Action可以返回ResultPromise<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返回一个(在它的签名中),那么我就无法返回另一个......

关于如何解决这个问题的任何想法?

2 个答案:

答案 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有一个需要返回承诺的场景,那么所有返回的结果都将被包装为承诺。

相关问题