2017-09-29 4 views
0

2 개의 API 끝점이 있습니다. 후자는 첫 번째 결과에 달려있다.Swift 및 PromiseKit으로 Alamofire 요청 연결

제 1 단부 지점에 대한 시장 JSON을 2 번째 종점 /api/v1/mayor/<id>/ 그래서

{ 
    region_id: 1, 
    mayor_id: 9 
}, 
{ 
    region_id: 1, 
    mayor_id: 10 
}, 

JSON 유사 영역들의 목록을 반환 /api/v1/regions/이다. 지금 내 워크 플로는 모든 지역을 가져 오는 첫 번째 API 호출을 작성한 다음 첫 번째 끝점에서 가져온 ID를 기반으로 /mayor/ 끝점에 대한 API 호출을 만들고 싶습니다. 그래서 예, 나는이 개 더 많은 통화를하고 싶습니다 :

/api/v1/mayor/9/ 
/api/v1/mayor/10/ 

을 이미 각각의 API 호출을 만들기 위해이 개 기능을 설정하고 성공적으로 다시 각각에 대한 JSON을 가지고있다.

func fetchRegions() -> Promise<[Region]> { 
} 

func fetchMayor(id: String) -> Promise<Mayor> { 
} 

이제이 모든 것을 어떻게 연결할 수 있는지보고 싶습니다. 이것은 내가 지금까지 가지고있는 것입니다 :

var fetchedRegions: [Region] = [] 
firstly { 
    fetchRegions() 
}.then { regions in 
    fetchedRegions = regions 
}.then { 
    for r in fetchedRegions { 
    self.fetchMayor(id: r.mayor_id).then { mayor in 
     print(mayor) 
    }.catch { error in 
    } 
    } 
}.catch { error in // Error: Missing return in a closure expected to return 'AnyPromise' 
    print(error) 
} 

답변

0

when(fulfilled:) 연산자를 사용해야합니다. 한 세트의 모든 약속이 성취 될 때까지 기다립니다.

when(fulfilled: promise1, promise2).then { results in 
    //… 
}.catch { error in 
    switch error { 
    case URLError.notConnectedToInternet: 
    //… 
    case CLError.denied: 
    //… 
    } 
} 

참고 : 제공된 약속 중 하나가 거부하는 경우, 반환 약속이 바로 그 오류와 함께 거부됩니다.
경고 : 다른 약속은 계속 해결되며 다른 약속에 따라 이행하거나 거부합니다. 이것은 getter 스타일의 비동기 작업에 적합한 패턴이지만, 종종 setter 작업 (예 : 서버에 데이터 저장)의 경우, 모든 작업을 기다렸다가 성공한 작업과 실패한 작업을 기반으로 작업을 수행해야합니다. 그러한 상황은 when(resolved:)을 사용합니다. 그 다음 보이는 당신의 예에 따라에서

는 (I 명시 적/출력 매개 변수의 모든 정의) :

fetchRegions() // fetch your regions async 
     .then { (regions: [Region]) -> Promise<[Mayor]> in // here you got array [Region] 
      var tasks: [Promise<Mayor>] = [] // create an array of promises to fetch 'Mayor' 
      for region in regions { 
       tasks.append(self.fetchMayor(id: region.mayorId)) 
      } 

      return when(fulfilled: tasks) // create promise which wait for all promises in a set to fulfill 
     }.then { (mayours: [Mayor]) -> Void in // here you will get an array of `Mayor` 
      // do here you want 
     }.catch { error in 
      print(error) 
    }