我在Playframework 2.4.6中的异步操作中使用F.Promise。我可以让我的DAO异步调用工作。我可以使用" map"和" flatMap"但我不确定以下情况。
我有一个从数据库中查找和反对的异步调用。如果找到该对象,那么我想使用该对象的一部分然后发出另一个异步请求来更新数据库中的该对象。这是我的控制器中的异步更新调用的一部分。我虽然做得不对。
我从以下开始。
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;
这似乎不起作用。在我从findUserPromise获得响应之前,我不想定义我的updatedUserPromise,因为可能找不到用户。如果找不到用户,我将返回F.Promise.pure(notFound(&#34;一些json结果&#34;))。如果找到了用户,那么我想用发布到我的控制器操作的Json标准更新该用户。使用我的方法,似乎我必须在返回任何结果之前使用对象(updatedUser)定义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;
感谢您的帮助。
答案 0 :(得分:0)
我不确定这是否是最好的方法,但这适用于我上面的情况。
function changeImage(){
var tag = event.target; //or document.getElementById("s1");
if(tag.style.backgroundImage !== "url('css/image1.jpg')") {
tag.style.backgroundImage = "url('css/image1.jpg')";
tag.style.backgroundSize = "contain";
tag.innerHTML = "";
}
else {
//set original settings here.
}
}
我发现链接承诺或嵌套承诺的所有示例,它们似乎都使用Web服务作为示例,它们似乎都在设计时已知。在我的情况下,我不知道我的foundUser对象在返回之前是什么,所以我需要在外部promise中创建我的内部承诺。