PromiseKit 6 - Создание нескольких уровней одновременных обещаний, которые зависят друг от друга - PullRequest
0 голосов
/ 07 мая 2020

Я работаю с 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
...