如何使用带 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 来返回最快的结果的主要内容,如果未能解决你的问题,请参考以下文章