簡體   English   中英

承諾 <Result> 和嵌套的異步承諾

[英]F.Promise<Result> and nested async promises

我在Playframework 2.4.6的異步操作中使用了F.Promise。 我可以接到異步調用來運行我的DAO。 我可以使用“地圖”和“ 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(“ some json result”))。 如果找到了用戶,那么我想使用發布到我的控制器操作中的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;

謝謝你的幫助。

我不確定這是否是執行此操作的最佳方法,但這對上面的情況有效。

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)));
    });
}

我發現的所有用於鏈接promise或嵌套promise的示例,它們似乎都使用Web服務作為示例,並且它們在設計時似乎都是眾所周知的。 在我的情況下,在返回之前,我不知道我的foundUser對象將是什么,因此我需要在外部Promise中創建我的內部Promise。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM