我如何使用 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)
}
我有一个网络请求。如果
,我想发出此请求并回退到缓存值- 请求失败
- 请求时间过长
我在想我可以使用 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)
}