在 PromiseKit 6 中正确链接多个承诺
Correctly chain multiple promises in PromiseKit 6
我正在使用 Promisekit 6 并定义了 3 个函数,所有这些函数都是 return promises。
第一个从本地数据库获取数据,第二个从在线 API 服务器获取数据。第三个,Foo,检查具有给定 id 的数据是否在本地存在,否则它在线检查并 returns 它。
我无法弄清楚如何正确链接承诺。以下是我到目前为止的想法,但我不确定创建新的承诺是否是个好主意。
任何反馈表示赞赏。
谢谢:)
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)
}
}
}
你没有处理 "recover" 中的错误,我认为这是一个奇怪的模式,无论如何最好不要像你那样包装 promises,并像这样链接更多 "vertically" :
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" 只有在需要包装非promise异步代码时才需要
我正在使用 Promisekit 6 并定义了 3 个函数,所有这些函数都是 return promises。 第一个从本地数据库获取数据,第二个从在线 API 服务器获取数据。第三个,Foo,检查具有给定 id 的数据是否在本地存在,否则它在线检查并 returns 它。
我无法弄清楚如何正确链接承诺。以下是我到目前为止的想法,但我不确定创建新的承诺是否是个好主意。 任何反馈表示赞赏。 谢谢:)
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)
}
}
}
你没有处理 "recover" 中的错误,我认为这是一个奇怪的模式,无论如何最好不要像你那样包装 promises,并像这样链接更多 "vertically" :
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" 只有在需要包装非promise异步代码时才需要