Vapor:在所有修改完成之前返回路由

Posted

技术标签:

【中文标题】Vapor:在所有修改完成之前返回路由【英文标题】:Vapor: route return before all modification done 【发布时间】:2019-12-24 19:15:01 【问题描述】:

我有以下路线:

router.post([Page].self, at: "/fetchStatusOfManagedReleases")  (req, pages) -> Future<[Page]> in
    let eventIds = pages.map  $0.events .flatMap  $0 .map  $0.id 
    return Release.query(on: req).filter(\.fbId ~~ eventIds).all().map  releases in
        var result: [Page] = []
        for p in pages 
            let page = p
            var pageEvents: [Event] = []
            for e in p.events 
                let event = e
                if let release = releases.first(where:  $0.fbId == e.id ) 
                    event.inProgress = release.inProgress
                    event.purpose = release.purpose
                    _ = try release.testPrices.query(on:req).all().map  testP in
                        event.testPrices = testP // <--- this line is not applied
                    
                 else 
                    event.inProgress = false
                
                pageEvents.append(event)
            
            page.events = pageEvents
            result.append(page)
        
        return result
    

不幸的是,event.testPrices = testP 没有被应用,它不会成为响应的一部分。我能做些什么?在某些情况下,我不需要推迟“返回”。如何解决调度问题?

【问题讨论】:

你必须使用flatten 数组有flatten,但我不能在这个上使用flatten_ = try release.testPrices.query(on:req).all().map 【参考方案1】:

我对@9​​87654322@ 进行了~~ 操作,之前也对Release 进行了操作。

router.post([Page].self, at: "/fetchStatusOfManagedReleases")  (req, pages) -> Future<[Page]> in
    let eventIds = pages.map  $0.events .flatMap  $0 .map  $0.id 
    return Release.query(on: req).filter(\.fbId ~~ eventIds).all().flatMap  releases in
        let releaseInnerIds = releases.map $0.id
        return TestPrice.query(on: req).filter(\.id ~~ releaseInnerIds).all().map  testPrices in
            var result: [Page] = []
            for p in pages 
                let page = p
                var pageEvents: [Event] = []
                for e in p.events 
                    let event = e
                    if let release = releases.first(where:  $0.fbId == e.id ) 
                        event.inProgress = release.inProgress
                        event.purpose = release.purpose
                        event.testPrices = testPrices.compactMap(testPrice in
                            if testPrice.release.parentID == release.id 
                                return testPrice
                             else 
                                return nil
                            
                        )
                     else 
                        event.inProgress = false
                    
                    pageEvents.append(event)
                
                page.events = pageEvents
                result.append(page)
            
            return result
        
    

【讨论】:

工作很好!当我在我的一个项目中有如此相似的工作时,仍然无法理解为什么我的解决方案对您不起作用。我想知道这是否归结为时机? 是的,我觉得是时候了,release.testPrices.query会在一个epoch之后执行。

以上是关于Vapor:在所有修改完成之前返回路由的主要内容,如果未能解决你的问题,请参考以下文章

Vapor `client.get`,转换并返回 json

Swift Vapor 服务器:如何在获取请求中返回嵌套字典?

XCTest 中未保留经过身份验证的 Vapor 会话

在 Swift Vapor 中返回响应可表示对象集合的最佳方法是啥?

使用 Vapor 迭代调用返回 Future 的方法

iOS:在多个后台线程完成之前不要从函数返回