在继续之前获取 [EventLoopF​​uture] 的所有值

Getting all values for [EventLoopFuture] before proceeding

我有一组值映射到多个承诺,每个承诺都给我一个 EventLoopF​​uture。所以我最终得到了一个具有可变大小 [EventLoopF​​uture] 的方法,并且我需要所有响应都成功才能继续。如果其中一个或多个returns出错,我需要执行错误场景。

如何等待整个 [EventLoopF​​uture] 完成,然后再继续成功路径或错误路径?

像这样

flatten 可以等待数组中的所有期货
[future1, future2, future3, future4].flatten(on: eventLoop)

对于 flatten 每个未来应该 return Voidflatten 本身将 return EventLoopFuture<Void>

有时我们需要处理一些具有简单值的数组,并使用 returns EventLoopFuture 的某种方法对每个值做一些事情,在这种情况下,代码可能如下所示

let array = ["New York", "Los Angeles", "Las Vegas"]

array.map { city in
     someOtherMethod(city).transform(to: ())
}.flatten(on: eventLoop)

在上面的示例中,方法 someOtherMethod 可以 return 未来使用任何东西,但我们可以将其转换为 EventLoopFuture<Void> 以与 flatten

一起使用

EventLoopFuture 有一个 reduce(into: ...) 方法可以很好地用于该目的(以及您想要累积多个值的其他任务):

let futureOfStrings: EventLoopFuture<[String]> =
    EventLoopFuture<String>.reduce(into: Array<String>(),
                                   futures: myArrayFutureStrings,
                                   on: someEventLoop,
                                   { array, nextValue in array.append(nextValue) })   

要专门将 [EventLoopFuture<Something>] 变成 EventLoopFuture<[Something]>,您还可以使用较短的 whenAllSucceed

let futureOfStrings: EventLoopFuture<[String]> =
    EventLoopFuture<String>.whenAllSucceed(myStringFutures, on: someEventLoop)