2017-04-18 1 views
0

PromiseKit을 사용하여 일부 콜백 지옥 피라미드의 파멸 코드를 길들이려하고 있습니다.PromiseKit 종속 약속은 초기 할당 해제 결과를

이렇게하려면 약속에서 비동기 코드를 래핑하지만 의존성 약속을 반환하는 방법에 따라 문제가 발생합니다. 약속을 풀고 성취/거절하면 모든 것이 잘되지만 내가 원하는 것보다 더 장황하다. 새로운 부양 약속을 되 찾으면 조기 할당을 받고 약속이 조용히 깨집니다.

나는이

{ a }.then { b }.then { c } // in temporal order, take that, callbacks! 

하지만 나를 기능 Promise<A> -> Promise<B>와 리팩토링하고, 내가 랩을 해제해야하는 이유 이해가 안이 작품의 일부로이 편리 것으로 보인다 관용적 PromiseKit,하지 않을 수도 있습니다 실현 모든 단계에서. 아는 사람 있나요?

다음은 문제를 재현하는 몇 가지 간단한 코드입니다. badStringFromInt이 즉시 수행 할 수없는 좋은 이유가 있다고 상상해보십시오.

func badStringFromInt(_ intPromise: Promise<Int>) -> Promise<String> { 
    return Promise { _, reject in 
     intPromise.then { i -> Promise<String> in 
      return Promise { fulfill, _ in 
       fulfill("\(i)") 
      } 
     }.catch { error in 
      reject(error) 
     } 
    } 
} 

func goodStringFromInt(_ intPromise: Promise<Int>) -> Promise<String> { 
    return Promise { fulfill, reject in 
     intPromise.then { i in 
      fulfill("\(i)") 
     }.catch { error in 
      reject(error) 
     } 
    } 
} 

func getInt() -> Promise<Int> { 
    return Promise{ fulfill, reject in 
     fulfill(5) 
    } 
} 

func doIt() { 
    // "then" never called, and this is logged: 
    // PromiseKit: Pending Promise deallocated! This is usually a bug 
    badStringFromInt(getInt()).then { s in 
     print("bad string is :" + s) 
    }.catch { error in 
     print("error: \(error)") 
    } 

    // all good! 
    goodStringFromInt(getInt()).then { s in 
     print("good string is :" + s) 
    }.catch { error in 
     print("error: \(error)") 
    } 
} 

답변

1

나는 뭔가를 놓쳐 야합니다. 왜 체인에 추가하지 않는 것이 좋을까요? 중간 약속을 만드는 것이 당신을 위해 무엇을합니까?

betterStringFromIntintPromise이 충족 될 때까지 기다린 후 약속 된 문자열을 반환합니다.

func betterStringFromInt(_ intPromise: Promise<Int>) -> Promise<String> { 
    return intPromise.then { i in 
     DispatchQueue.main.promise { 
      return "\(i)" 
     } 
    } 
} 
+0

아니요, 저는 누락되었습니다. 나는'next'가'Promise '를 반환했다는 것을 알지 못했고, 이제는 그것을 반환하고 오류 처리를 더 이상 체인에서 처리하도록합니다. 나는 아직도 할당 해제 문제를 이해하지 못한다. 그러나 불필요한'약속 (Promise) '래퍼는 이제 사라 졌으므로 정말로 필요하지는 않다. 고맙습니다! –