2017-04-19 7 views
1

현재 PromiseKit을 기존 프로젝트에 통합해야하는지 조사 중입니다.PromiseKit (선택형 약속 포함)

내 주요 문제는 최대 5 개의 웹 서비스를 호출 할 수있는 비즈니스 로직을 구현해야한다는 것입니다. 그들 중 일부는 이전의 결과에 따라 호출됩니다.

현재 아키텍처는 서로를 호출하는 클로저를 사용하여 여러 함수에서 코드를 분해 한 것입니다.

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 블록에서 이러한 오류를 처리하면 오류가 발생합니다. 예제에서는 verify 단계를 거치지 만 isValidPhoneNumber를 호출하면 다른 단계가 실행되지 않습니다. Promise (value :)를 넣은 곳에서는 실제 웹 서비스 호출을 사용합니다. 로그를 업데이트하는 마지막 단계가 항상 실행되어야하는 경우 .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 약속은 선택 사항입니다. 전화 번호가 유효한 경우에만 실행해야합니다. 제가 전화하지 않으면 오류로 간주되지 않습니다. –