PromiseKit с URLSession - PullRequest
       23

PromiseKit с URLSession

2 голосов
/ 08 октября 2019

Я пытаюсь добавить проверку кода состояния ответа, если моя удаленная служба возвращает 401.

Я пытаюсь использовать расширение PromiseKit URLSession.

Представьте, что у меня есть что-то базовое, например

        return firstly {
            URLSession.shared.dataTask(.promise, with: request)
        }.compactMap {
            try JSONDecoder().decode(T.self, from: $0.data)
        }

. Я хотел бы добавить проверку кода состояния ответа, чтобы я мог выдать ошибку и выполнить некоторые дальнейшие действия.

Что-то вроде

        return firstly {
            URLSession.shared.dataTask(.promise, with: request)
        }.map { session  in
            if (session.response as? HTTPURLResponse)?.statusCode == 401 {
                // throw a custom error here
                // something like
                // throw TokenProviderError.unauthorized
            }

            return session.data

        }.compactMap {
            try JSONDecoder().decode(T.self, from: $0)
        }.catch { error in
            // check the error thrown here and do something
        }

Это исключение

Невозможно преобразовать возвращаемое выражение типа 'PMKFinalizer' в возвращаемый тип 'Promise'

Можно ли ввести что-то вроде retryWhen, что позволит мне отлавливать ошибки и проверять?

1 Ответ

0 голосов
/ 08 октября 2019

Поскольку .catch ничего не возвращает, но вы хотите вернуть Promise<T>, поэтому вы должны удалить .catch здесь, так как

return firstly {
    URLSession.shared.dataTask(.promise, with: request)
}.map { session  in
    if (session.response as? HTTPURLResponse)?.statusCode == 401 {
        // throw a custom error here
        // something like
        // throw TokenProviderError.unauthorized
    }

    return session.data

}.compactMap {
    try JSONDecoder().decode(T.self, from: $0)
}

.catch будет реализован вызываемым пользователем.


ИЛИ, может быть, вы ищете что-то вроде,

func test() -> Promise<Any> {
    return firstly(execute: { () -> Promise<String> in
        return .value("bhai")
    }).map({ string -> Promise<Double?> in
        return .value(0.1)
    }).compactMap({ double -> NSError in
        return NSError(domain: "", code: 0, userInfo: nil)
    })
}
...