4

假设我想生成一个需要多个 Promise 来解决的数据集,我将如何将每个结果存储在 Promise 链中,以便我可以一次性创建最终数据集?

struct CompleteData {
    let a: String
    let b: String
}

func getData() -> Promise<CompleteData> {
    getA().then { a -> Promise<String> in
        return a.getB()
    }.then { b -> CompleteData in
        return CompleteData(a: ???, b: b)
    }
}

我想出的解决方案感觉不够优雅:

临时 IUO

使用隐式展开的选项来存储临时值。如果我忘记分配给 ,这可能会中断a

func getData() -> Promise<CompleteData> {
    var a: String!
    getA().then { _a -> Promise<String> in
        _a = a
        return _a.getB()
    }.then { b -> CompleteData in
        return CompleteData(a: a, b: b)
    }
}

嵌套承诺

嵌套承诺并从外部范围访问值。这通过进入嵌套地狱而破坏了承诺的目的。

func getData() -> Promise<CompleteData> {
    getA().then { a -> Promise<CompleteData> in
        return a.getB().then { b -> CompleteData in
            return CompleteData(a: a, b: b)
        }
    }
}

我头顶上的其他解决方案:使用可选字段 in CompleteData,使用var字段 inCompleteData并在链解析时分配,这些都对我没有好处。

有人能想出一种更优雅的方式来做到这一点吗?

4

1 回答 1

6

您可以使用元组将数据沿承诺链传递。您只需要指定元组和“a”返回承诺。使用 .map 返回元组。这是您的示例中的代码:

struct CompleteData {
    let a: String
    let b: String
}

func getData() -> Promise<CompleteData> {
    getA().then { a -> Promise<(String, a)> in
        return a.getB().map{ ($0, a) }
        }.then { (b, a) -> CompleteData in
            return CompleteData(a: a, b: b)
    }
}

PromiseKit 文档

希望它会帮助你。干杯:)

于 2018-04-24T11:19:36.267 回答