簡體   English   中英

Vapor 4 從 EventLoopFuture 獲取字符串<string></string>

[英]Vapor 4 Get String from EventLoopFuture<String>

我正在處理 web,其中我有屬於特定“類別”的“帖子”,因此,當我列出帖子時,我想顯示類別名稱,所以我做了:

private func getCategory(from id: UUID, andRequest req: Request) -> EventLoopFuture<String> {

        let categoryField = BlogCategoryModel.find(id, on: req.db).map { cat in
            return cat?.title ?? "Unknown"
        }

        return categoryField
    }

所以,我不知道如何使用這個EventLoopFuture<String>來獲取我需要的字符串。

更新

我將為您提供更多背景信息。

所以,我有一個 controller 來顯示元素列表:

protocol ListController: ModelController {
    func listView(req: Request) throws -> EventLoopFuture<View>
    
    func listTable(_ models: [Model], req: Request) -> Table
    func listContext(req: Request, table: Table) -> ListContext
}

public struct ListContext: Encodable {

    public let title: String
    public let table: Table

    internal init(title: String, table: Table) {
        self.title = title
        self.table = table
    }
}


extension ListController {

    func listContext(req: Request, table: Table) -> ListContext {
        .init(title: Model.name.plural.capitalized, table: table)
    }
    
    func listView(req: Request) throws -> EventLoopFuture<View> {
        Model.query(on: req.db)
            .all()
            .map { listTable($0, req: req) }
            .flatMap { table in
                req.view.render("Common/List", listContext(req: req, table: table))
            }
    }
}

然后,我可以使用此協議顯示任何類型的 model。在這種情況下,我想顯示類別為父親的博客:

struct BlogPostAdminController: ListController{

    typealias Model = BlogPostModel
    
    func listTable(_ models: [Model], req: Request) -> Table {
        Table(columns: ["image", "title", "category"], rows: models.map { model in
            TableRow(id: model.id!.uuidString, cells: [
                TableCell(type: .image, model.image),
                TableCell(model.title),
                TableCell(getCategory(from: model.$category.id, andRequest: req)),
            ])
        })
    }

    private func getCategory(from id: UUID, andRequest req: Request) -> EventLoopFuture<String> {

        let categoryField = BlogCategoryModel.find(id, on: req.db).map { cat in
            return cat?.title ?? "Unknown"
        }

        return categoryField
    }
}

你的問題不清楚。

您是在某處調用該方法還是注冊為路由?

如果您正在調用該方法: 提示:您需要了解更多關於 (Future / Promise) 的想法是您需要 map 它才能異步獲取值(這意味着:如果獲取值不是即時的,您應該' 阻塞等待該值的線程)。

注冊為路由:路由會在響應體中返回你的值,你可以將其解碼或直接讀取為字符串。

如果不了解更多有關從何處調用此 function 的信息,則很難知道,但如果您只需要將BlogCategoryModel DB 調用轉換為EventLoopFuture<String> ,我會嘗試這樣做。

    private func getCategory(from id: UUID, andRequest req: Request) -> EventLoopFuture<String> {
    
        return BlogCategoryModel.find(id, on: req.db)
            .flatMap { cat in
                return cat?.title ?? "Unknown"
            }
    }

暫無
暫無

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

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