假设我有两个承诺,我想与when(resolved:)
结合使用。如果第一个承诺存在问题,我想拒绝承诺,但是否则另外解决。从本质上讲,这就是我想要做的事情:
func personAndPetPromise() -> Promise<(Person, Pet?)> {
let personPromise: Promise<Person> = ...
let petPromise: Promise<Pet> = ...
when(resolved: personPromise, petPromise).then { _ -> (Person, Pet?) in
if let error = personPromise.error {
return Promise(error: error) // syntax error
}
guard let person = personPromise.value else {
return Promise(error: myError) // syntax error
}
return (person, petPromise.value)
}
}
这样外面的我可以这样做:
personAndPetPromise().then { person, pet in
doSomethingWith(person, pet)
}.catch { error in
showError(error)
}
问题出在then { _ in
的{{1}}区块内。这种方法无法同时返回personAndPetPromise
和Promise(error:)
。
我怎么能拒绝这个街区?
答案 0 :(得分:2)
问题是(Person, Pet?)
函数有两个重载:
then
第一个public func then<U>(on q: DispatchQueue = .default, execute body: @escaping (T) throws -> U) -> Promise<U>
public func then<U>(on q: DispatchQueue = .default, execute body: @escaping (T) throws -> Promise<U>) -> Promise<U>
会返回body
并导致U
返回then
。
第二个Promise<U>
会返回body
并导致Promise<U>
返回then
。
由于在这种情况下我们想要返回错误或有效响应,我们强制使用第二次重载。
这是一个有效的版本。主要区别在于我将其从Promise<U>
更改为-> (Person, Pet?)
:
-> Promise<(Person, Pet?)>
另一种做同样事情的方法是抛出错误而不是试图返回它:
func personAndPetPromise() -> Promise<(Person, Pet?)> {
let personPromise: Promise<Person> = ...
let petPromise: Promise<Pet> = ...
when(resolved: personPromise, petPromise).then { _ -> Promise<(Person, Pet?)> in
if let error = personPromise.error {
return Promise(error: error)
}
guard let person = personPromise.value else {
return Promise(error: myError)
}
return Promise(value: (person, petPromise.value))
}
}