Swift 映射EventLoopFuture时出错<;类型>;到预期的类型
我尝试过映射、平面映射、创建Swift 映射EventLoopFuture时出错<;类型>;到预期的类型,swift,vapor,swift-nio,Swift,Vapor,Swift Nio,我尝试过映射、平面映射、创建Post的EventLoopFuture,等等。。。我试图返回两个db.query,它们创建单独的内容数组,在req.view.render上呈现,这将返回一个EventLoopFuture 我的错误是:无法将类型为“EventLoopFuture”的值转换为预期的参数类型“[Posts]”。 以下是路由器调用的我的代码: func blogView(req: Request) throws -> EventLoopFuture<View> {
Post
的EventLoopFuture
,等等。。。我试图返回两个db.query
,它们创建单独的内容数组,在req.view.render
上呈现,这将返回一个EventLoopFuture
我的错误是:无法将类型为“EventLoopFuture”的值转换为预期的参数类型“[Posts]”。
以下是路由器调用的我的代码:
func blogView(req: Request) throws -> EventLoopFuture<View> {
struct PageContext: Encodable {
var posts: [Posts]
var categories: [Categories]
var title: String
}
struct Posts: Encodable {
var posts: BlogPostModel.ViewContext
var category: BlogCategoryModel.ViewContext
}
struct Categories: Encodable {
var categoryList: BlogCategoryModel.ViewContext
}
let posts = BlogPostModel.query(on: req.db)
.sort(\.$date, .descending)
.with(\.$category)
.all()
.mapEach {Posts(posts: $0.viewContext, category: $0.category.viewContext)}
let categories = BlogCategoryModel.query(on: req.db)
.sort(\.$title)
.all()
.mapEach {Categories(categoryList: $0.viewContext)}
let returnContext = PageContext(posts: posts,categories: categories, title: categories)
return req.view.render("Blog/Frontend/Blog", returnContext)
}
您的问题是您的
PageContext
类型具有类型[Post]
和[Categories]
的属性,但您正在尝试使用EventLoopFuture
和EventLoopFuture
初始化PageContext
。您可以使用NIO的和
方法将2个EventLoopFuture
对象组合成1个:
posts.and(categories) // EventLoopFuture<([Post], [Categories])>
您的问题是您的
PageContext
类型具有类型[Post]
和[Categories]
的属性,但您正在尝试使用EventLoopFuture
和EventLoopFuture
初始化PageContext
。您可以使用NIO的和
方法将2个EventLoopFuture
对象组合成1个:
posts.and(categories) // EventLoopFuture<([Post], [Categories])>
看起来很清楚
posts
是未来的,因此不能将其指定为PageContext的posts
。我不知道vapor,但在我看来,你有一个来自未来的运营商链,你需要得到未来的输出——它需要实际运行。您需要响应未来的运行,例如在whenComplete
操作符中。是的,我知道。。。我正在与vapor语法作斗争。我想把柱子压平。我会在.mapeach之后的链中使用.flatMap()来展平未来的帖子以获得帖子,但是,它会在.mapeach上抛出一个错误,抱怨没有推断出新值。我认为这不是语法给你带来的问题。我认为你们并没有掌握什么是未来及其伴随的管道。这是一系列在未知的未来某个时候会发生的行动。在该链的末端——不是在链的外部,而是在链中,作为它的最终操作员——您可以接收从管道末端弹出的值。在这里,您将附加whenComplete
操作符,然后在whenComplete
操作符中创建Posts对象。但请注意,代码的最后一行揭示了一个更大的误解。您不能返回此管道生成的值,原因很简单,管道将在将来运行。这就是未来!该方法将在未来有机会运行并生成其输出之前返回。所以,如果我没有弄错的话,你在这里的整个方法是错误的。(我只是根据我对“异步”的含义以及在其他框架(如Combine)中的未来的了解来猜测。)是的。。。我明白了。。。下面是有效的代码。。。我正在尝试在返回前向链中添加第二个db.query。。。此代码段获取我的帖子(以及相关的类别),并返回分配给req的未来值。我试图做的是返回类别数组(不仅仅是那些分配给帖子的类别)。请看我刚才在编辑中添加的代码片段…看起来很清楚posts
是未来的,因此不能将其指定为PageContext的posts
。我不知道vapor,但在我看来,你有一个来自未来的运营商链,你需要得到未来的输出——它需要实际运行。您需要响应未来的运行,例如在whenComplete
操作符中。是的,我知道。。。我正在与vapor语法作斗争。我想把柱子压平。我会在.mapeach之后的链中使用.flatMap()来展平未来的帖子以获得帖子,但是,它会在.mapeach上抛出一个错误,抱怨没有推断出新值。我认为这不是语法给你带来的问题。我认为你们并没有掌握什么是未来及其伴随的管道。这是一系列在未知的未来某个时候会发生的行动。在该链的末端——不是在链的外部,而是在链中,作为它的最终操作员——您可以接收从管道末端弹出的值。在这里,您将附加whenComplete
操作符,然后在whenComplete
操作符中创建Posts对象。但请注意,代码的最后一行揭示了一个更大的误解。您不能返回此管道生成的值,原因很简单,管道将在将来运行。这就是未来!该方法将在未来有机会运行并生成其输出之前返回。所以,如果我没有弄错的话,你在这里的整个方法是错误的。(我只是根据我对“异步”的含义以及在其他框架(如Combine)中的未来的了解来猜测。)是的。。。我明白了。。。下面是有效的代码。。。我正在尝试在返回前向链中添加第二个db.query。。。此代码段获取我的帖子(以及相关的类别),并返回分配给req的未来值。我试图做的是返回类别数组(不仅仅是那些分配给帖子的类别)。请看我刚才在编辑中添加的片段…是的!谢谢你,凯勒。我知道我需要把这两种未来结合起来。。。只是不知道该怎么做,马上把两个都弄平。真的很感谢你把整个过程都安排好了@Caleb++。对谢谢你,凯勒。我知道我需要把这两种未来结合起来。。。只是不知道该怎么做,马上把两个都弄平。真的很感谢你把整个过程都安排好了@Caleb++。
return posts.and(categories).flatMap { posts, categories in
let returnContext = PageContext(posts: posts, categories: categories, title: "Blog Posts")
return req.view.render("Blog/Frontend/Blog", context)
}