2017-04-19 15 views
1

現在、私はPromiseKitを既存のプロジェクトに統合する必要があるかどうか調査中です。PromiseKit(オプション約束あり)

私の主な問題は、最大5つのWebサービスを呼び出すことができるビジネスロジックを実装する必要があることです。以前のものの結果に応じて呼び出されるものもあります。

現在のアーキテクチャは、互いに呼び出すクロージャを使用していくつかの関数でコードを分割することに基づいています。

PromiseKit(または何か他のもの)で管理しやすいコードを書くことができるかどうかを調べようとしています。ここで

は私が行って必要なもののいくつかの擬似コードです:totiGの答えに基づいて

 // if true, the phone validation is skipped 
     let forceRequest = false 
     // true if a 3rd party web-service has checked the phone number 
     let isVerified = true 
     // true if the 3rd party checked the phone number and it is valid 
     var isValid = false 

     if !isVerified { 
      // update value from 3rd party web-service 
      isValid = isValidPhoneNumberPromise() 
     } 

     // If the phone no is invalid stop execution (unless forced) 
     if !isValid && !force { 
      throw MyError.error1 
     } 

     // web request to create order 
     createOrderPromise() 

     // if we have a valid phone number, first send an SMS, then update log 
     if isValid { 
      sendSmsPromise() 
      updateLogPromise() 
     } 

、私は以下のバリエーションで来た:

var isValid = isValid 

     firstly 
     { 
      return Controller.verify(isVerified: isVerified, isValid: isValid) 
     } 
     .then { _isValid -> Promise<Int> in 
      isValid = _isValid 
      return Controller.createOrder() 
     } 
     .then 
     { _ -> Promise<Bool> in 
      if isValid { 
       return Controller.isSendSms() 
      } 

      return Promise (value: true) 
     } 
     .then 
     { _ -> Promise<Bool> in 
      if isValid { 
       return Controller.updateLog() 
      } 

      return Promise (value: true) 
     } 
     .catch 
     { error in 
      print (error) 
     } 

答えて

0

はいあなたはPromiseKitを使用してこれを行うことができます。あなたが必要とするものを示す基本的な例を書いています。ステップが失敗した場合はエラーをスローし、catchブロックのエラーを処理することに注意してください。私の例では、検証ステップは成功しますが、isValidPhoneNumberが呼び出された場合は、他のステップの実行を停止します。プロミス(値:)を置いた場所では、実際のWebサービスコールを行います。ログを更新する最終ステップが常に実行される必要がある場合は、これを.alwaysに入れてください。

enum Errors: Error { 
    case invalidPhone 
    case orderFailed 
} 

func orderPromise() { 
    firstly { 
     self.verify(isVerified: false, force: true) 
    }.then { _ in 
     self.createOrder() 
    }.then { orderNumber in 
     self.sendSms(orderNumber: orderNumber) 
    }.then { smsSent in 
     self.updateLog(smsSent: smsSent) 
    }.catch { error in 
     //Do something with the error 
    } 
} 

private func verify(isVerified: Bool, force: Bool) -> Promise<Bool> { 
    if isVerified || force { 
     return Promise(value: true) 
    } 
    return isValidPhoneNumber() 
} 

private func isValidPhoneNumber() -> Promise<Bool> { 
    return Promise(error: Errors.invalidPhone) //Assume that this fails, then catch in 'orderPromise' will be run 
} 

private func createOrder() -> Promise<String> { 
    //Assume an order number is being passed back to use in the message 
    return Promise(value: "Order100") 
} 

private func sendSms(orderNumber: String) -> Promise<Bool> { 
    return Promise(value: true) 
} 

private func updateLog(smsSent: Bool) -> Promise<Bool> { 
    return Promise(value: true) 
} 
+0

ありがとうございました。こんにちは、私はあなたのコードのバリエーションを使用して終了した(質問の編集を参照してください)、あなたが私のアプローチの問題を参照してください私に教えてください。 –

+0

コードは機能しますが、すべての関数でisValidプロパティがtrueであることを確認しています。プロミスは、前のステップが有効な場合にのみ次のステップが実行されるように機能します。私の例のように、検証が失敗したときにエラーを返します(または例外をスローする可能性があります)。これによりcatch関数が実行され、どこでもisValidのチェックを心配する必要はありません。 – totiG

+0

最後の2つの約束事はオプションであるという問題があります。電話番号が有効な場合にのみ実行する必要があります。私がそれらを呼ばないと、エラーとはみなされません。 –

関連する問題