Swift中如何在Promise链的done块获取所有依赖传递的值?
解决方案
你可以通过在每个.then块中返回包含之前所有依赖值和当前新值的元组(或自定义结构体),来实现后续块能访问所有前置结果。
方法一:使用元组传递多值
修改链式调用,让每个then返回包含历史值和当前请求结果的元组,这样后续的闭包就能拿到所有需要的值:
firstly { Network.shared.getInfo() } .then { info -> (Info, UserDetail) in // 先请求UserDetail,拿到结果后和info一起返回 return Network.shared.getUserDetail(info).map { (info, $0) } } .then { info, detail -> (Info, UserDetail, AddOn) in // 再请求AddOn,拿到结果后和info、detail一起返回 return Network.shared.getAddOn(detail).map { (info, detail, $0) } } .done { info, detail, addOn in // 这里可以同时访问info、detail和addOn // do stuff with all three values } .catch { error in // 处理错误 }
方法二:使用自定义结构体(更易读)
如果需要传递的值较多,元组会变得冗长,这时可以定义一个结构体来封装所有需要的结果:
struct FullUserContext { let info: Info let detail: UserDetail let addOn: AddOn } // 链式调用修改如下 firstly { Network.shared.getInfo() } .then { info -> (Info, UserDetail) in Network.shared.getUserDetail(info).map { (info, $0) } } .then { info, detail -> FullUserContext in Network.shared.getAddOn(detail).map { FullUserContext(info: info, detail: detail, addOn: $0) } } .done { context in // 通过context.info、context.detail、context.addOn访问所有值 // do stuff with context.info, context.detail, context.addOn } .catch { error in // 处理错误 }
核心思路
因为每个请求依赖前一个的结果,所以必须在链式传递中主动把历史值携带下去——Promise本身不会自动保留之前的结果,需要你在每个步骤显式地将需要的结果和新请求的结果一起返回。这种方式既满足了依赖顺序,又能在最终的.done块中拿到所有需要的数据。
内容的提问来源于stack exchange,提问作者Fry
相关产品推荐
相关产品推荐

