Асинхронное выполнение в vapor. Как управлять циклом для

#swift #vapor

#swift #vapor

Вопрос:

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

возвращается до того, как будут получены значения

Я хотел бы подождать, пока не будут получены желаемые значения, а затем вернуть их

Комментарии:

1. Эй, это происходит потому, что вы выполняете фьючерсы внутри цикла for.

2. Я считаю, что вам нужен всего лишь простой запрос с ВНУТРЕННИМ соединением, чтобы получать необходимые новости.

Ответ №1:

Спасибо. Это работает с

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