Java 承诺<;结果>;和嵌套的异步承诺

Java 承诺<;结果>;和嵌套的异步承诺,java,playframework,Java,Playframework,我在Playframework 2.4.6中的异步操作中使用了F.Promise。我能够得到对我的DAO的异步调用来工作。我能够使用“地图”和“平面地图”,但我不确定以下情况 我有一个异步调用来从数据库中查找对象。如果找到了该对象,那么我希望使用该对象的一部分,然后发出另一个异步请求来更新数据库中的该对象。这是控制器中异步更新调用的一部分。不过,我做得不对 我从以下几点开始 F.Promise<User> findUserPromise = userService.findAsync

我在Playframework 2.4.6中的异步操作中使用了F.Promise。我能够得到对我的DAO的异步调用来工作。我能够使用“地图”和“平面地图”,但我不确定以下情况

我有一个异步调用来从数据库中查找对象。如果找到了该对象,那么我希望使用该对象的一部分,然后发出另一个异步请求来更新数据库中的该对象。这是控制器中异步更新调用的一部分。不过,我做得不对

我从以下几点开始

F.Promise<User> findUserPromise = userService.findAsync(id);
F.Promise<User> updateUserPromise = userService.updateAsync(updatedUser);

F.Promise<Result> resultPromise = findUserPromise.flatMap((foundUser){
    // update foundUser with passed in Json criteria
    foundUser.firstName = firstName; // etc...

    return updateUserPromise.map((updatedUser) -> {
        return ok(Json.toJson(u));
    });
});

return resultPromise;
F.Promise-findUserPromise=userService.findAsync(id);
F.Promise updateUserPromise=userService.updateAsync(UpdateUser);
F.Promise resultPromise=findUserPromise.flatMap((foundUser){
//使用传入的Json条件更新foundUser
foundUser.firstName=firstName;//等等。。。
返回updateUserPromise.map((updateUser)->{
返回ok(Json.toJson(u));
});
});
返回结果promise;
这似乎不起作用。在findUserPromise回复之前,我不想定义我的UpdateUserPromise,因为可能找不到用户。如果找不到用户,我将返回F.Promise.pure(notFound(“一些json结果”))。如果找到一个用户,那么我想用发布到我的控制器操作的Json标准更新该用户。在我的方法中,在返回任何结果之前,似乎必须使用对象(UpdateUser)定义updateUserPromise的异步调用

我可以在承诺的结果中定义另一个承诺吗

我是这样想的,但是由于编译错误而失败。推理变量B的边界不兼容,等式约束:play.mvc.Result,下限:play.libs.F.Promise

F.Promise<User> findUserPromise = userService.findAsync(id);

F.Promise<Result> resultPromise = findUserPromise.map((foundUser) -> {
    // foundUser is returned, now update it, or return not found...

    // define our next promise with an updated foundUser object
    F.Promise<User> userPromise = userService.updateAsync(foundUser);
    F.Promise<Result> resultPromise2 = userPromise.map((u) -> {
        return jsonResult(ok(Json.toJson(u)));
    });
    return resultPromise2;

});

return resultPromise;
F.Promise-findUserPromise=userService.findAsync(id);
F.Promise resultPromise=findUserPromise.map((foundUser)->{
//foundUser已返回,现在更新它,或返回未找到。。。
//使用更新的foundUser对象定义我们的下一个承诺
F.Promise-userPromise=userService.updateAsync(foundUser);
F.Promise resultPromise2=userPromise.map((u)->{
返回jsonResult(ok(Json.toJson(u));
});
返回结果建议2;
});
返回结果promise;

谢谢你的帮助。

我不确定这是否是最好的方法,但这对我上面的情况有效

F.Promise<User> findUserPromise = userService.findAsync(id);

return findUserPromise.flatMap((fu) -> {

    if (fu == null) {
        ObjectNode result = Json.newObject();
        result.put("error", "Not found " + id);
        return F.Promise.pure(jsonResult(notFound(result)));
    }

    // dynamically update fields on found user
    fu.userName = userName;
    fu.firstName = firstName;
    // more updates...

    // make a new promise that will use the updated foundUser object
    F.Promise<User> updateUserPromise = userService.updateAsync(fu);

    return updateUserPromise.map((uu) -> {
        return jsonResult(ok(Json.toJson(uu)));
    });
}
F.Promise-findUserPromise=userService.findAsync(id);
返回findUserPromise.flatMap((fu)->{
如果(fu==null){
ObjectNode result=Json.newObject();
结果.put(“错误”、“未找到”+id);
返回F.Promise.pure(jsonResult(notFound(result));
}
//在找到的用户上动态更新字段
fu.userName=用户名;
fu.firstName=firstName;
//更多更新。。。
//做出将使用更新的foundUser对象的新承诺
F.Promise updateUserPromise=userService.updateAsync(fu);
返回updateUserPromise.map((uu)->{
返回jsonResult(ok(Json.toJson(uu));
});
}

我找到的所有链接承诺或嵌套承诺的示例,它们似乎都使用web服务作为示例,并且它们似乎在设计时都是已知的。在我的情况下,我不知道我的foundUser对象将是什么,直到它返回,所以我需要在外部承诺中创建我的内部承诺。

你不应该这样做吗
flatMap
也在
findUserPromise
上?也许我一直都有,但我用错了什么。谢谢回复。