Как я могу отловить ошибку в запросе при использовании PromiseKit? - PullRequest
0 голосов
/ 08 апреля 2019

Я начал использовать PromiseKit в асинхронных запросах, и у меня пока есть проблема, я не могу разобрать ошибку в цепочке. У меня есть менеджер запросов с методом, подобным этому:

func request(
        url: String,
        parameters: JSON? = nil,
        requestMethod: HTTPMethod,
        completion: @escaping completion
    ) {
        self.logger.log(category: .network, message: "Starting request", access: .public)
        Alamofire.request(
            url,
            method: requestMethod,
            parameters: parameters,
            encoding: JSONEncoding.prettyPrinted
        ).responseData { response in
            if let data = response.data {
                self.logger.log(category: .network, message: "Response: \(data)", access: .private)
                completion(.success(data))
            } else {
                self.logger.log(category: .network, message: SWError.dataError.localizedDescription, access: .public, type: .error)
                completion(.failure(SWError.dataError))
            }
        }
    }

Запрос создается так:

public class func getSettings(
        completion: @escaping (Result<Model.Settings.Settings>) -> Void
        ) {
        RequestManager.shared.request(
            url: Endpoint.Settings.slash.url(),
            requestMethod: .get
        ) { result in
            switch result {
            case let .success(data):
                do {
                    let result = try JSONDecoder().decode(Model.Settings.Settings.self, from: data)
                    completion(.success(result))
                } catch {
                    Request.Shared.handleCode(from: data, completion: { serverCode in
                        logger.log(category: .network, message: SWError.decodingError.localizedDescription, access: .public, type: .error)
                        completion(.failure(serverCode))
                    })
                }
            case let .failure(error):
                completion(.failure(error))
            }
        }
    }

Обещание часть здесь:

private func getAppSettings() -> Promise<[Model.Settings.Datum]> {
        return Promise { seal in
            Request.Settings.getSettings(completion: { result in
                switch result {
                case let .success(model):
                    if let data = model.data {
                        seal.fulfill(data)
                    } else {
                        seal.reject(SWError.create(with: "No app settings data"))
                    }
                case let .failure(error):
                    seal.reject(error)
                }
            })
        }
    }

Почему-то я не могу уловить ошибку. Что не так с моей просьбой? Как правильно это сделать?

1 Ответ

0 голосов
/ 08 апреля 2019

Замените CompletionHandler в запросе и получите настройки с обещаниями. Я изменил это до некоторой степени исходя из моего понимания.

Изменить

func request(url: String,
             parameters: JSON? = nil,
             requestMethod: HTTPMethod,
             completion: @escaping completion)

до

func request(url: String,
             parameters: JSON? = nil,
             requestMethod: HTTPMethod) -> Promise<[Model.Settings.Datum]> {
    return Promise { seal in

    self.logger.log(category: .network, message: "Starting request", access: .public)
    Alamofire.request(
        url,
        method: requestMethod,
        parameters: parameters,
        encoding: JSONEncoding.prettyPrinted
        ).responseData { response in
            if let data = response.data {
                self.logger.log(category: .network, message: "Response: \(data)", access: .private)
                seal.fulfill(data)
            } else {
                self.logger.log(category: .network, message: SWError.dataError.localizedDescription, access: .public, type: .error)
                seal.reject(.failure(SWError.dataError))
            }
        }
    }
}

А также изменить

public func getSettings( completion: @escaping (Result<Model.Settings.Settings>) -> Void)

до

public func getSettings() -> Promise<[Model.Settings.Settings]>  {
    return Promise { seal in

    RequestManager.shared.request(
        url: Endpoint.Settings.slash.url(),
        requestMethod: .get).then { data in
            do {
                let result = try JSONDecoder().decode(Model.Settings.Settings.self, from: data)
                seal.fulfill(result)
            } catch {
                Request.Shared.handleCode(from: data).then { serverCode in
                    logger.log(category: .network, message: SWError.decodingError.localizedDescription, access: .public, type: .error)
                    seal.reject(.failure(serverCode))
                }
            }
    }
}

После внесения изменений используйте эти методы в getAppSettings, чтобы случаи ошибок могли быть успешно обнаружены.

func getAppSettings() -> Promise<[Model.Settings.Datum]> {
    return Promise { seal in
        Request.Settings.getSettings.then { model in
            if let data = model.data {
                seal.fulfill(data)
            } else {
                seal.reject(SWError.create(with: "No app settings data"))
            }
        }
    }
}
...