Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 映射EventLoopFuture时出错<;类型>;到预期的类型_Swift_Vapor_Swift Nio - Fatal编程技术网

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