首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Play Framework2.2.x恢复平台图

Play Framework2.2.x恢复平台图
EN

Stack Overflow用户
提问于 2014-02-28 21:19:22
回答 2查看 1.3K关注 0票数 1

我希望恢复我的承诺,并从其中返回delegate.call(上下文),但我只能返回SimpleResult。

代码语言:javascript
复制
public class Authenticate extends Action<Authentication> {
    @Override
    public Promise<SimpleResult> call(final Context context) throws Throwable {
        WSRequestHolder holder = WS.url(...);
        final Promise<Response> promise = holder.get();
        Promise<SimpleResult> result = promise.flatMap(new Function<Response, Promise<SimpleResult>>() {
            @Override
            public Promise<SimpleResult> apply(Response response) throws Throwable {
                JsonNode user = response.asJson().path("response");
                context.args.put("user", user);
                return delegate.call(context);
            }
        }).recover(new Function<Throwable, SimpleResult>() {
            @Override
            public SimpleResult apply(Throwable e) {
                /* cant return delegate.call(context); from here */
                return redirect(routes.Application.index());
            }
        });
        return result;
    }
}

也许在方法调用之前还有其他标准和更好的方法来存储用户信息?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-02 02:48:31

您发布的解决方案不是一个好的解决方案,您永远不应该在进行异步编程时使用Await.result,您可能会导致死锁和大量的性能问题。

我们需要向Play允诺API添加一个recoverWith方法,但在这种情况发生之前,您可以这样做(为了简洁起见,可以使用JDK8语法):

代码语言:javascript
复制
public class Authenticate extends Action<Authentication> {
  public Promise<SimpleResult> call(final Context context) throws Throwable {
    Promise<SimpleResult> result = WS.url(...).get();
    Promise<SimpleResult> result = promise.flatMap( response -> {
      JsonNode user = response.asJson().path("response");
      context.args.put("user", user);
      return delegate.call(context);
    }).map(Promise::pure).recover( e -> {
      return delegate.call(ontext)(routes.Application.index());
    }).flatMap(a -> a);
    return result;
  }
}

基本上,上面通过与Promise<SimpleResult>映射将Promise<Promise<SimpleResult>>还原为Promise::pure,然后可以恢复返回的Promise<SimpleResult>,然后它用标识函数将flatMapping的承诺平平。

票数 5
EN

Stack Overflow用户

发布于 2014-03-01 11:24:40

我解决了这个问题:

代码语言:javascript
复制
WSRequestHolder holder = WS.url(...)
final Promise<Response> userPromise = holder.get();
Promise<SimpleResult> result = Promise.promise(new Function0<Response>() {
    @Override
    public Response apply() throws Throwable {
        Timeout timeout = new Timeout(2000);
        Future<Response> future = userPromise.wrapped();                
        Response response = Await.result(future, timeout.duration());   
        return response;
    }
}).flatMap(new Function<Response, Promise<SimpleResult>>() {
    @Override
    public Promise<SimpleResult> apply(Response response) throws Throwable {
        try {
            JsonNode userInfo = response.asJson();
            context.args.put("user", userInfo);
        } catch(Exception ex) {
        }   
        return delegate.call(context);
    }               
});
return result;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22106019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档