让我们说我想生成一个需要多个承诺来解决的数据集,我如何将每个结果存储在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)
}
}
我提出的解决方案不够优雅:
使用隐式解包的选项来存储临时值。如果我忘记分配给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>
有人能想出一种更优雅的方式吗?
答案 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)
}
}
希望它会对你有所帮助。干杯:)
答案 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
});
}