[英]Play Framework 2.2.x recover flatmap
我想恢复我的诺言,并从中返回委托。调用(上下文),但我只能返回SimpleResult。
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;
}
}
也许还有其他标准更好的方法可以在方法调用之前存储userinfo?
您发布的解决方案不是一个好的解决方案,永远不要在进行异步编程时使用Await.result,否则可能会导致死锁和严重的性能问题。
我们需要在Play recoverWith
API中添加一个recoverWith
方法,但是在此之前,您可以这样做(为简便起见,使用JDK8语法):
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::pure
映射将Promise<SimpleResult>
为Promise<Promise<SimpleResult>>
,然后您可以恢复返回的Promise<SimpleResult>
,然后通过用flatMapping标识来使承诺的承诺变平功能。
我解决了这个问题:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.