如何通过承诺链传递数据?

时间:2016-12-03 08:31:59

标签: swift promise promisekit

让我们说我想生成一个需要多个承诺来解决的数据集,我如何将每个结果存储在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)
    }
}

嵌套承诺

Nest承诺并访问外部作用域的值。通过陷入困境,这违背了承诺的目的。

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

我头脑中的其他解决方案:使用CompleteData中的可选字段,使用var中的CompleteData字段并指定链解析,这些对我都不利。< / p>

有人能想出一种更优雅的方式吗?

2 个答案:

答案 0 :(得分:2)

您可以使用元组在promise链中传递数据。你只需要指定元组和&#34; a&#34;回报承诺。使用.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 documentation

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

答案 1 :(得分:-1)

function getDependentResults() {
    var result = {};
    return promiseMethod1()
        .then(data => {
            result.data1 = data;
            return promiseMethod2();
        })
        .then(data => {
            result.data2 = data;
            return promiseMethod3();
        })
        .then(data => {
            result.data3 = data;
            return promiseMethod4();
        })
        .then(data => {
            result.data4 = data;
            return result; // resolve with an object that contains everything
        });
}