我如何使用 PromiseKit w/ Race 来 return 最快的结果

How can I use PromiseKit w/ Race to return the quickest result

我有一个网络请求。如果

,我想发出此请求并回退到缓存值

我在想我可以使用 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<_>'

我想说的是 return 第一个解决的问题,在这种情况下 cachedResponse 如果 request 花费的时间超过 4 秒。

您首先需要做几件事。看起来您的请求之一 return 是可选的,您需要以某种方式处理此问题,因为 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)
  }