【问题标题】:How to wait on multiple PromiseKit promises which have a different payload?如何等待具有不同有效负载的多个 PromiseKit 承诺?
【发布时间】:2018-11-20 02:48:57
【问题描述】:

在我的项目中,我有许多函数可以从底层数据源异步获取数据并将结果作为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 {
...
}

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

let promises: [Promise&lt;Any&gt;] = [userPromise, documentPromise]

但现在我收到一个错误,Promise&lt;User&gt; 无法分配给 Promise&lt;Any&gt;。坦率地说,我无法想象它。有什么问题?

P.S. 为了让事情更容易掌握,我创建了以下 sn-p:

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

let promise: Promise<Any> = getPromise()

产生类似的错误:Cannot convert value of type 'Promise&lt;String&gt;' to specified type 'Promise&lt;Any&gt;' 任何想法如何解决它?谢谢!

环境: PromiseKit 6.2.4、Swift 4.1、Xcode 9.4

【问题讨论】:

  • 你找到答案了吗?
  • 不,很遗憾。
  • 其实我有。你可以试试:__PMKWhen([AnyPromise.init(try fetchUser(with: userID)), try AnyPromise.init(fetchDocument(with: documentID))])
  • 有趣!谢谢。会试试看。

标签: ios swift generics promisekit


【解决方案1】:

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

public func when<T>(resolved promises: Promise<T>...)

您是否特别需要不被拒绝的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)
  }

【讨论】:

  • 感谢您的回复,丹! :) public func when&lt;T&gt;(resolved promises: Promise&lt;T&gt;...) - 是的,这就是为什么我试图将 Promise&lt;User&gt; 向上转换为 Promise&lt;Any&gt;,这是一个有效的向上转换 AFAIK,但由于某种原因它不起作用? 至于 when(fulfilled:_:) 选项 - 它完全有与when(resolved:_:) 相同的签名,所以它在我的情况下也不起作用......
  • @Serzhas nope,when 函数的“已解决”版本具有以下签名:when&lt;T&gt;(resolved promises: Promise&lt;T&gt;...) -&gt; Guarantee&lt;[Result&lt;T&gt;]&gt;,而“实现”版本是这个:when&lt;U, V&gt;(fulfilled pu: U, _ pv: V) -&gt; Promise&lt;(U.T, V.T)&gt; where U : Thenable, V : Thenable。注意区别:resolved 接受可变参数,这与传递具有相同类型项的数组相同。另一方面,fulfilled 接受两个可能但不一定是不同类型的参数。
  • 谢谢,丹!我将尝试使用可变参数的“实现”版本:)
猜你喜欢
  • 2014-06-14
  • 2020-08-14
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多