PromiseKit退后一步

时间:2017-11-13 16:42:59

标签: ios swift promisekit

我的应用程序中有一系列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做到这一点?

2 个答案:

答案 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