【问题标题】:Vapor 4 Get String from EventLoopFuture<String>Vapor 4 从 EventLoopF​​uture<String> 获取字符串
【发布时间】:2021-11-23 09:11:53
【问题描述】:

我在一个网络上工作,其中我有属于特定“类别”的“帖子”,所以,当我列出帖子时,我想显示类别名称,所以我这样做了:

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&lt;String&gt; 来获取我需要的字符串。

更新

我将为您提供更多背景信息。

所以,我有一个控制器来显示元素列表:

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

然后,我可以使用这个协议来展示任何类型的模型。在这种情况下,我想显示带有类别父亲的博客:

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

【问题讨论】:

    标签: fluent vapor vapor-fluent leaf


    【解决方案1】:

    你的问题不清楚。

    你是在某处调用方法还是注册为路由?

    如果您正在调用该方法: 提示:您需要了解更多关于 (Future / Promise) 这个想法是你需要映射它以便异步获取值(这意味着:如果获取值不是即时的,你不应该阻塞等待值的线程)。

    注册为路由: 该路由将在响应正文中返回您的值,您可以将其解码或直接读取为字符串。

    【讨论】:

      【解决方案2】:

      如果不知道从哪里调用这个函数很难知道,但如果你需要的只是将BlogCategoryModel DB 调用转换为EventLoopFuture&lt;String&gt;,我会试试这个。

          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"
                  }
          }
      

      【讨论】:

        猜你喜欢
        • 2021-10-30
        • 2020-09-24
        • 2020-09-22
        • 2021-04-23
        • 2020-03-25
        • 1970-01-01
        • 1970-01-01
        • 2021-03-24
        • 2020-11-11
        相关资源
        最近更新 更多