如何等待具有不同有效负载的多个 PromiseKit 承诺?

Ser*_*has 5 generics ios swift promisekit

在我的项目中,我有许多函数可以从底层数据源异步获取数据并将结果作为 返回Promise<T>,其中T可选的模型对象。我需要并行获取 2 个不同的独立对象。为此,我尝试使用when(resolved: [Promise<T>])函数:

let userPromise: Promise<User> = fetchUser(with: userID)
let documentPromise: Promise<Document> = fetchDocument(with: documentID)

when(resolved: [userPromise, documentPromise]).done {
...
}
Run Code Online (Sandbox Code Playgroud)

但我收到了一个错误Cannot invoke 'when' with an argument list of type '(resolved: [Any])'。我试图将承诺分配给显式声明的数组:

let promises: [Promise<Any>] = [userPromise, documentPromise]

但现在我收到了一个Promise<User>无法分配给Promise<Any>. 坦率地说,我无法围绕它。那里有什么问题?

PS为了使事情更容易掌握,我创建了以下代码段:

func getPromise() -> Promise<String> {
   return Promise<String>.pending().promise
}

let promise: Promise<Any> = getPromise()
Run Code Online (Sandbox Code Playgroud)

这会产生类似的错误:Cannot convert value of type 'Promise<String>' to specified type 'Promise<Any>' 任何想法如何解决它?谢谢!

环境: PromiseKit 6.2.4、Swift 4.1、Xcode 9.4

Dan*_*yev 6

when(resolved:)被声明为只接受相同类型的承诺。这是它的签名:

public func when<T>(resolved promises: Promise<T>...)
Run Code Online (Sandbox Code Playgroud)

你特别需要一个不拒绝when(resolved:)吗?你试过when(fulfilled:_:)吗?不同之处在于后者在提供的承诺之一拒绝后立即拒绝。

如果可以使用when(fullfilled:_:),那么您可以编写如下内容:

when(fulfilled: [userPromise, documentPromise])
  .done { user, document in
    // ...
  }
  .catch { error in
    // either of promises has been rejected
    print(error)
  }
Run Code Online (Sandbox Code Playgroud)