我的应用程序中有一系列UIViewControllers(弹出窗口),用于从最终用户收集信息。我设法用这样的承诺链接他们:
firstly {
return showFirstPopup()
}
.then { info1 -> Promise<Info2> in
dismissFirstPopup()
//Do sth with info1...
return showSecondPopup()
}
.then { info2 -> Promise<Info3> in
dismissSecondPopup()
//Do sth with info2...
return showThirdPopup()
}
.then { info3 -> Promise<Info4> in
dismissThirdPopup()
//Do sth with info3...
return showForthPopup()
}
...
.catch { error in
//Handle any error or cancellation...
}
例如,如果用户在第三个弹出窗口中按下,我需要返回上一个“然后”并且不取消整个流程。
基本上我需要能够返回一步,让用户编辑数据,然后继续流程。
有没有办法用PromiseKit做到这一点?
答案 0 :(得分:1)
这是我最终使用的。希望这也可以帮助其他人。
func myFunc(info: Info) -> Promise<()>
{
return Promise { fulfill, reject in
let firstPromise = shouldShowFirstPopup ? showFirstPopup() : Promise(value: info.info1)
firstPromise
.then { info1 -> Promise<Info2> in
info.info1 = info1
if (info.shouldShowSecondPopup) {
return showSecondPopup()
}
return Promise(value: info.info2)
}
.then { info2 -> Promise<Info3> in
info.info2 = info2
info.shouldShowSecondPopup = false
if (info.shouldShowThirdPopup) {
return showThirdPopup()
}
return Promise(value: info.info3)
}
.then { info3 -> Promise<()> in
info.info3 = info3
info.shouldShowThirdPopup = false
return processEverything()
}
.then { _ -> () in
fulfill(())
}
.catch { error in
switch error {
case MyErrors.backPressed(let popupType):
switch popupType {
case .firstPopup:
reject(MyErrors.userCanceled)
return
case .secondPopup:
info.shouldShowFirstPopup = true
info.shouldShowSecondPopup = true
case .thirdPopup:
info.shouldShowSecondPopup = true
info.shouldShowThirdPopup = true
default:
reject(MyErrors.defaultError(message: "Not implemented case exception"))
return
}
firstly {
return myFunc(info: info)
}
.then { _ -> () in
fulfill(())
}
.catch { error2 in
reject(error2)
}
default:
reject(error)
}
}
}
}
答案 1 :(得分:0)
以下是我发现的PromiseKit:
PromiseKit 在中取消了取消的概念。如果用户取消某些内容,那么通常您不希望继续使用承诺链,但您也不希望显示错误消息。什么是取消? 这不是成功,也不是失败,但它应该更像是一个错误,即。它应该跳过所有后续处理程序。 PromiseKit将取消视为一种特殊的错误。
根据这个,你将跳过所有随后的处理程序。 以下是我找到此信息的链接:Promise Kit