2017-11-13 22 views
1

私は、エンドユーザーから情報を収集するために使用する一連のUIViewController(ポップアップ)をアプリケーションに持っています。私はにはこのような約束でそれらをチェーン管理:PromiseKitは一歩前に戻る

、例えば、ユーザーが戻って私は、以前の「その後」に戻って全体の流れをキャンセルしないようにする必要がある第三ポップアップで押した場合
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... 
    } 

基本的に私は1ステップ戻って、ユーザーにデータを編集させてから、フローを続行できるようにする必要があります。

PromiseKitでこれを行う方法はありますか?ここで

答えて

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) 
      } 
     } 
    } 
} 
0

は、私がPromiseKitについて見つけたものです:

PromiseKitはで焼いキャンセルの概念を持っています。ユーザーが何かをキャンセルした場合、通常はプロミスチェーンを続行したくないが、エラーメッセージも表示したくない。だから、キャンセルは何ですか? これは成功しておらず、失敗ではありませんが、エラーのように処理する必要があります。それ以降のすべてのハンドラをスキップする必要があります。 PromiseKitは特別な種類のエラーとして取り消しを具体化しています。

これによれば、その後のすべてのハンドラをスキップします。 ここに私がこの情報を見つけたリンクがあります:Promise Kit

+0

ありがとうございますが、私はフローをキャンセルしたくありません。私は一歩前に戻ることができる必要があります。私は私の最初の質問で私がはっきりしていないことに気づいた。私は今それを更新しました。 – Diana

関連する問題