2017-09-29 133 views
0

我有2個API端點;後者取決於第一個的結果。使用Swift和PromiseKit鏈接Alamofire請求

的第一端點是/api/v1/regions/,它返回像這樣

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

區域JSON的列表中的第二端點是/api/v1/mayor/<id>/,它返回一個關於市長JSON。我現在的工作流程是進行第一次API調用以獲得所有區域,然後我想根據從第一個端點獲得的ID對/mayor/端點進行一堆API調用。因此,在這個例子中,我想打2個電話:

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

我已經設置了2個功能,使每個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:)

在根據你的榜樣它看起來如下(我明確定義的所有輸入/輸出參數):

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) 
    }