2017-05-12 5 views
0

을 감안할 때 다음과 같은 방법으로이 약속을 구성 : 내가 먼저 캐시를 시도하여, 새로운 약속을 반환하는 방법을 구현 한PromiseKit : 하나

func loadFromCache(url: URL) -> Promise<Array<StockItem>> 
func loadFromNetwork(url: URL) -> Promise<Array<StockItem>> 

, 다음 네트워크는

func load(skip: Int, query: String?, onlyInStock: Bool = false) -> Promise<Array<StockItem>> { 

    let url = self.urlFor(skip: skip, query: query, onlyInStock: onlyInStock) 
    print("Loading: \(url)") 

    return Promise { fulfill, reject in 
     self.loadFromCache(url: url).then { (items) in 
      return fulfill(items) 
     }.catch { (error) in 
      self.loadFromNetwork(url: url).then { (items) in 
       fulfill(items) 
      }.catch { (error) in 
       reject(error) 
      } 
     } 
    } 
} 
다음과 같이

위의 메서드를 작성하는 더 좋은 방법이 있어야한다고 생각합니다. 중첩 된 클로저없이 적절한 약속 체인으로 어떻게 작성할 수 있습니까?

즉, 두 가지 약속을 어떻게 하나로 구성 할 수 있습니까?

+0

관련이 있습니까? http://stackoverflow.com/questions/7040844/applicatives-compose-monads-dont –

답변

2

당신이 찾고있는 것은 recover 연산자입니다.

func load(skip: Int, query: String?, onlyInStock: Bool = false) -> Promise<[StockItem]> { 
    let url = urlFor(skip: skip, query: query, onlyInStock: onlyInStock) 
    return loadFromCache(url: url).recover { _ in 
     return loadFromNetwork(url: url) 
    } 
}