1

假设我有两个要与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 { _ inpersonAndPetPromise. 该方法不可能同时返回 aPromise(error:)和 a (Person, Pet?)

我还能如何拒绝阻止?

4

1 回答 1

2

问题是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返回 aU并导致then返回Promise<U>

第二个body返回 aPromise<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))
    }
}

做同样事情的另一种方法是抛出错误而不是尝试返回它:

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 {
            throw error
        }
        guard let person = personPromise.value else {
            throw myError
        }
        return (person, petPromise.value)
    }
}
于 2017-03-30T17:57:01.560 回答