Vapor: route return before all modification done

妖精的绣舞 提交于 2020-01-06 07:39:09

问题


I have following route:

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

Unfortunatelly event.testPrices = testP is not applied, it will e not part of the response. What can I do? At some cases I do not need to postpone "return". How can I dissolve scheduling issue?


回答1:


I do a ~~ operation on TestPrice also as for Release before.

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


来源:https://stackoverflow.com/questions/59472699/vapor-route-return-before-all-modification-done

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!