Как ждать завершения нескольких фьючерсов в Vapor Swift? - PullRequest
1 голос
/ 21 марта 2019

Я пытаюсь понять, как ждать завершения нескольких фьючерсов. Я знаю, как их асинхронно ждать: summaryFuture.whenSuccess {} но это только один случай. Мне нужно подождать, пока итоги итогового и будущего спонсора закончатся, а затем поработать с обоими, прежде чем отправлять ответ.

  let summaryFuture = client.post(summaryURL) { post in
        post.http.headers.add(name: "authtoken", value: token)
        }.flatMap(to: SummaryModel.self) { (response) in
            return try response.content.decode(SummaryModel.self)
    }

  let sponsorEnrollerFuture = client.post(sponsporEnroller) { post in
        post.http.headers.add(name: "authtoken", value: token)
        }.flatMap(to: SponsorEnrollerModel.self) { (response) in
            return try response.content.decode(SponsorEnrollerModel.self)
    }

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

Вы можете использовать либо .and, либо .flatten

. Для .flatten ваш фьючерс должен вернуть Void, поэтому конечный результат также будет Future<Void>.

.and может использоваться следующим образом:

let summaryFuture = client.post(summaryURL) { post in
    post.http.headers.add(name: "authtoken", value: token)
}.flatMap(to: SummaryModel.self) { (response) in
    return try response.content.decode(SummaryModel.self)
}

let sponsorEnrollerFuture = client.post(sponsporEnroller) { post in
    post.http.headers.add(name: "authtoken", value: token)
}.flatMap(to: SponsorEnrollerModel.self) { (response) in
    return try response.content.decode(SponsorEnrollerModel.self)
} 

// Now combine the two futures
return summaryFuture.and(sponsorEnrollerFuture).map { summary, sponsorEnrolled in
    print("summary: \(summary)")
    print("sponsorEnrolled: \(sponsorEnrolled)")
}
0 голосов
/ 21 марта 2019

Хорошо. Я понял.

Чтобы дождаться завершения нескольких фьючерсов , вы должны использовать .add. В моем конкретном случае.

 let summaryFuture = client.post(summaryURL) { post in
        post.http.headers.add(name: "authtoken", value: token)
        }.flatMap(to: SummaryModel.self) { (response) in
            return try response.content.decode(SummaryModel.self)
    }

  let sponsorEnrollerFuture = client.post(sponsporEnroller) { post in
        post.http.headers.add(name: "authtoken", value: token)
        }.flatMap(to: SponsorEnrollerModel.self) { (response) in
            return try response.content.decode(SponsorEnrollerModel.self)
    } 

  // Now combine the two futures
 let multipleFutures = summaryFuture.add(sponsorEnrollerFuture)

 // Now I can use
 mutipleFutures.whenSuccess = {(summary, sponsorEnroller) in ...}
...