我有兩個異步呼叫來從服務器獲取資料,但我希望它們將它們作為單個回應處理,也希望處理每個回應的錯誤。
例如,這里我有兩種方法m1(),m2()每種方法都可以通過不同型別的錯誤。
我們應該等待得到兩者的回應并根據其錯誤型別顯示錯誤訊息。如果沒有錯誤,繼續流程。我們必須使用哪個運算子?我嘗試了Publishers.Zip&Publishers.Map無法處理錯誤。
enum Error1: Error {
case e1
}
enum Error2: Error {
case e2
}
func m1() -> Future<Bool, Error1> {
return Future { promise in
DispatchQueue.main.asyncAfter(deadline: .now() 2) {
promise(.failure(.e1))
}
}
}
func m2() -> Future<String, Error2> {
return Future { promise in
DispatchQueue.main.asyncAfter(deadline: .now() 3) {
promise(.success("1"))
}
}
}
幫助將不勝感激。!謝謝你。
uj5u.com熱心網友回復:
Publisher我認為您遇到的問題與 a只能發出一種錯誤型別的事實有關。因此,每當您嘗試組合m1andm2時,每個都有不同的錯誤型別,然后您就會遇到型別沖突問題。
您可以選擇幾種方法來解決此問題。我要推薦一個。在我的解決方案中,您的每個請求(您的 Futures)都將使用錯誤型別Never,但單個請求的成功或失敗將在Result. 這是 Playground 中的代碼:
import Foundation
import Combine
enum Error1: Error {
case e1
}
enum Error2: Error {
case e2
}
func m1(shouldFail: Bool) -> Future<Result<Bool, Error1>, Never> {
return Future { promise in
DispatchQueue.main.asyncAfter(deadline: .now() 2) {
if(shouldFail) {
promise(.success(.failure(.e1)))
} else {
promise(.success(.success(true)))
}
}
}
}
func m2(shouldFail: Bool) -> Future<Result<String, Error2>, Never> {
return Future { promise in
DispatchQueue.main.asyncAfter(deadline: .now() 3) {
if(shouldFail) {
promise(.success(.failure(.e2)))
} else {
promise(.success(.success("1")))
}
}
}
}
let subscribe = m1(shouldFail: false)
.zip(m2(shouldFail: true))
.sink {
(m1:Result<Bool, Error1>, m2:Result<String, Error2>) in
switch m1 {
case .success(let boolResult) :
print("M1 succeeded with result \(boolResult)")
case .failure(_) :
print("M1 failed")
}
switch m2 {
case .success(let stringResult) :
print("M2 succeeded with result \(stringResult)")
case .failure(_) :
print("M2 failed")
}
}
(請注意,我shouldFail在您的 m1 和 m2 請求中添加了一個引數,以便您可以在一個或另一個請求失敗時處理不同的情況)。
請注意,每個期貨都回傳一種Future<SomeKindOfResult, Never>. 這意味著進入組合管道的期貨具有相同的錯誤型別(它恰好是Never)。這導致了看起來非常奇怪的構造:
promise(.success(.failure(.e1)))
這有點奇怪,但它表示 Future 同意請求已完成,并且Result攜帶該請求的成功或失敗。
管道用于zip等待兩個請求完成。出來的值zip是一個元組(Result<Bool, Error1>, Result<String, Error2>。該元組準確地表示每個請求的成功或失敗,并在每種情況下攜帶適當的值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/441314.html
