【问题标题】:How can I use PromiseKit w/ Race to return the quickest result如何使用带 Race 的 PromiseKit 来返回最快的结果
【发布时间】: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

【问题讨论】:

    标签: swift asynchronous promisekit


    【解决方案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)
      }
    

    【讨论】:

      猜你喜欢
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 2018-05-14
      相关资源
      最近更新 更多