Sergius
Sergius

Reputation: 53

Async execution in vapor. How to control the cycle for in

func loadBy(_ req: Request) throws -> Future<[News]> {
    let parentId = try req.parameters.next(String.self)
    let parent = try self.findParentBy(req, parentId: parentId)
    var childNews: [News] = []

    let qq = parent.map(to: [News].self) { parentNews in
        for chilId in parentNews!.childIds {
            let ch = News.query(on: req).filter(\News.newsId == chilId).first().map(to: News?.self) { child in
                if let child = child {
                    childNews.append(child)
                }
                return child
            }
        }
        return childNews
    }

    return qq.flatMap(to: [News].self) { childNews in
        return childNews.map { news in
            Future.map(on: req) { news }
        }.flatten(on: req)
    }
}

returned before the values will be obtained

I would like to wait until the desired values are obtained and then return them

Upvotes: 1

Views: 245

Answers (1)

Sergius
Sergius

Reputation: 53

Thanks. It's works with

func loadBy(_ req: Request) throws -> Future<[News]> {
        let parentId = try req.parameters.next(String.self)
        let parent = try self.findParentBy(req, parentId: parentId)
        var childNews: [News] = []

        return parent.flatMap(to: [News].self) { parentNews in
            return parentNews!.childIds.map { (key) in
                return News.query(on: req).filter(\News.newsId == key).first().map(to: Void.self) { child in
                    if let child = child {
                        childNews.append(child)
                    }
                }
            }.flatten(on: req).map {
                return childNews
            }
        }
    }

func loadBy(_ req: Request) throws -> Future<[News]> {
        let parentId = try req.parameters.next(String.self)
        let parent = try self.findParentBy(req, parentId: parentId)
        return parent.flatMap(to: [News].self) { parentNews in
            return News.query(on: req).filter(\News.newsId ~~ parentNews!.childIds).all()
        }
    }

Upvotes: 1

Related Questions