Я работаю с PromiseKit 6 в Swift, и у меня проблема с извлечением данных асинхронным извлечением данных, которые зависят от результатов вложенного асинхронного вызова.
В частности, мне нужно получить массив профилей которые я представляю как объекты LiveSyncProfile. Для каждого профиля мне нужно создать еще один набор асинхронных вызовов для получения соответствующих категорий как объектов LiveSyncCategory, и для каждой категории мне нужно получить соответствующие пакеты как объекты LiveSyncBatch.
Это сложно, но более или менее может быть представлен большим деревом. Моя проблема в том, что when (forfill) возвращается после завершения первого обещания и не ожидает завершения всех остальных обещаний в моем списке. В Интернете есть запутанные инструкции по этому поводу. Я пробовал использовать when (решить), но не нашел много примеров. @mxci заявил, что он использовал его дважды за последние 5 лет, поэтому я ищу другие варианты. Может быть .thenMap будет более эффективным? ниже ... Они возвращают обещания и используют Alamofile для звонков
func getProfiles() -> Promise<[LiveSyncProfile]> {
return Promise { seal in
//print("(getProfiles) Getting profiles...")
let url = getBaseURL() + "/" + "getProfiles"
Alamofire.request(url)
.validate()
.responseJSON { response in
//print("Profiles response \(response)")
switch response.result {
case .success(let json):
//print("(getProfiles) Got profiles")
guard let json = json as! NSArray as? [String] else {
return seal.reject(AFError.responseValidationFailed(reason: .dataFileNil))
}
var profiles : [LiveSyncProfile] = []
for profile in json{
//print("(getProfiles) Profile: \(profile)")
profiles.append(LiveSyncProfile(profile: profile))
}
seal.fulfill(profiles)
case .failure(let error):
NSLog("(getProfiles) Failed to get profiles")
seal.reject(error)
}
}
}
}
func getCategories(_ profile: String) -> Promise<[LiveSyncCategory]> {
return Promise { seal in
//print("(getCategories) Getting categoiries...")
let parameters = ["profile": profile]
let url = getBaseURL() + "/" + "getCategories"
Alamofire.request(url, parameters: parameters)
.validate()
.responseJSON { response in
//print("Categories response \(response)")
switch response.result {
case .success(let json):
//print("(getCategories) Got categories")
guard let json = json as! NSArray as? [String] else {
return seal.reject(AFError.responseValidationFailed(reason: .dataFileNil))
}
var categories : [LiveSyncCategory] = []
for category in json{
//print("(getCategories) Category: \(profile)")
categories.append(LiveSyncCategory(profile: profile, category: category))
}
seal.fulfill(categories)
case .failure(let error):
NSLog("(getCategories) Failed to categories")
seal.reject(error)
}
}
}
}
func getBatches(_ profile: String, _ category: String) -> Promise<[LiveSyncBatch]> {
return Promise { seal in
//print("(getBatches) Getting batches...")
let parameters = ["profile": profile, "category": category]
let url = getBaseURL() + "/" + "getBatches"
Alamofire.request(url, parameters: parameters)
.validate()
.responseJSON { response in
//print("Batches response \(response)")
switch response.result {
case .success(let json):
//print("(getBatches) Got batches")
guard let json = json as! NSArray as? [String] else {
return seal.reject(AFError.responseValidationFailed(reason: .dataFileNil))
}
var batches : [LiveSyncBatch] = []
for batch in json{
//print("(getBatches) Batches: \(batch)")
batches.append(LiveSyncBatch(profile: profile, category: category, batch: batch))
}
seal.fulfill(batches)
case .failure(let error):
NSLog("(getBatches) Failed to batches")
seal.reject(error)
}
}
}
}
Thanks