在 PromiseKit 6 中正确链接多个 Promise
Posted
技术标签:
【中文标题】在 PromiseKit 6 中正确链接多个 Promise【英文标题】:Correctly chain multiple promises in PromiseKit 6 【发布时间】:2018-06-19 12:28:33 【问题描述】:我正在使用 Promisekit 6 并定义了 3 个函数,所有这些函数都返回承诺。 第一个从本地数据库获取数据,第二个从在线 API 服务器获取数据。第三个,Foo,检查本地是否存在给定id的数据,否则在线检查并返回。
我无法弄清楚如何正确链接承诺。以下是我到目前为止的想法,但我不确定创建一个新的承诺是否是一个好主意。 任何反馈表示赞赏。 谢谢:)
func daoClient.get(id: String) -> Promise<Any>
return Promise seal in
do
let realm = try Realm()
if let data = realm.object(ofType: DataEntity.self, forPrimaryKey: id)
seal.fulfill(alert)
else
seal.reject(Errors.DataError(error: "no data found with id \(id)"))
catch
seal.reject(error)
func apiClient.get(id: String) -> Promise<swiftyJson.JSON>
return self.oiRequestClient.request(self.endpoint, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil)
.responseJSON()
.compactMap (arg) -> JSON? in
let json = JSON(arg.json)
if let response = arg.response.response, response.statusCode > 399
let error = json["error"].dictionary?.description
throw Errors.NetWorkError(error: error)
else
return json
func Foo(id: String) -> Promise<Any>
return Promise seal in
daoClient
.get(id: id)
.done data in
seal.fulfill(data)
.recover (error: Error) in
return self.apiClient
.get(id: id)
.done data in
seal.fulfill(data)
.catch error in
seal.reject(error)
【问题讨论】:
【参考方案1】:你没有在“恢复”中处理错误,这是一个奇怪的模式,无论如何最好不要像你那样包装承诺,而是像这样更“垂直”地链接:
func Foo(id: String) -> Promise<Any>
return firstly
return daoClient.get(id: id)
.compactMap data in
return data
.recover _ -> Promise<swiftyJson.JSON> in
return self.apiClient.get(id: id)
.compactMap data in
return data
"return Promise seal in" 仅在需要包装非承诺异步代码时才需要
【讨论】:
以上是关于在 PromiseKit 6 中正确链接多个 Promise的主要内容,如果未能解决你的问题,请参考以下文章
While Loop 在 Promisekit 完成运行并在 Swift 中返回正确的值之前递增并重新运行