在then块中拒绝返回的promise

时间:2017-03-30 17:57:02

标签: swift generics promisekit

假设我有两个承诺,我想与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}}区块内。这种方法无法同时返回personAndPetPromisePromise(error:)

我怎么能拒绝这个街区?

1 个答案:

答案 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))
    }
}