假设我想生成一个需要多个 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
并在链解析时分配,这些都对我没有好处。
有人能想出一种更优雅的方式来做到这一点吗?