如何使用带 Race 的 PromiseKit 来返回最快的结果

Posted

技术标签:

【中文标题】如何使用带 Race 的 PromiseKit 来返回最快的结果【英文标题】:How can I use PromiseKit w/ Race to return the quickest result 【发布时间】:2019-12-30 17:50:59 【问题描述】:

我有一个网络请求。如果

,我想发出这个请求并回退到缓存值 请求失败 请求时间过长

我在想我可以使用race 来提出请求,也可以使用after 给自己一个兑现承诺的时间。

类似的东西-

  func getCompany() -> Promise<Company> 

    let request: Promise<Company> = client.request(.getCompany)
    let cachedResponse: Promise<Company?> = cache.getObject(ofType: Company.self, forKey: "company")

    return race(request, after(seconds: 4).then(cachedResponse))
  

但是使用

编译失败
Cannot convert value of type 'Promise<Company?>' to expected argument type '(Void) -> Guarantee<_>'

我想说基本上返回第一个解决的问题,在这种情况下,如果 request 花费的时间超过 4 秒,则返回 cachedResponse

【问题讨论】:

【参考方案1】:

您首先需要做几件事。看起来您的一个请求返回了一个可选的,您需要以某种方式处理这个问题,因为race 将要求所有承诺符合相同的类型。

如果您打算在其他地方使用这种方法,我建议您创建一个简单的实用程序来解决延迟响应。

func await<T>(for delay: TimeInterval, then body: Promise<T>) -> Promise<T> 
  return after(seconds: delay).then  _ in body 


然后您可以重构您的 getCompany 方法以将您的请求竞争为:

  func getCompany() -> Promise<Company?> 
    let request: Promise<Company?> = client.request(.getCompany)
    let cachedResponse: Promise<Company?> = await(for: 2, then: cache.getObject(ofType: Company.self, forKey: "company"))

    return race(request, cachedResponse)
  

【讨论】:

以上是关于如何使用带 Race 的 PromiseKit 来返回最快的结果的主要内容,如果未能解决你的问题,请参考以下文章

PromiseKit入门

如何使用 PromiseKit/照片?

PromiseKit 无法在链中命中

如何使用 PromiseKit 重构快速回调以承诺

如何使用 Combine + Swift 复制 PromiseKit 风格的链式异步流

如何在 Swift 中使用 PromiseKit 和 Firebase?