gpt4 book ai didi

swift - 带有 URLSession 的 PromiseKit

转载 作者:行者123 更新时间:2023-12-05 00:33:04 29 4
gpt4 key购买 nike

如果我的远程服务返回 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
}

这有一个异常(exception)

Cannot convert return expression of type 'PMKFinalizer' to return type 'Promise'

是否可以引入类似 retryWhen 的东西,这将使我能够捕获错误并进行检查?

最佳答案

我试图实现与您所做的完全相同的事情,我认为您正在寻找的 retrywhen 功能称为 recover,您可以在 GitHub PromiseKit Document 中找到它

  • 请注意以下代码没有经过编辑器,可能无法编译,我只是用它来演示流程。
return firstly {
URLSession.shared.dataTask(.promise, with: request)
}.map { session in
if (session.response as? HTTPURLResponse)?.statusCode == 401 {
throw TokenProviderError.unauthorized
}
return session.data
}.compactMap {
try JSONDecoder().decode(T.self, from: $0)
}
// above is a copy of your code
.recover { error in // instead of .catch, use .recover here
guard let err = error as? TokenProviderError,
err == .unauthorized
else { throw error } // we only care 401 error here, other error will be handled in caller's .catch

// in my case, the reason for 401 error is due to an expired access token, so I will try to use refresh token to get a valid access token and make the same request again
return firstly {
loginWithRefreshToken(token: myRefreshToken)
}.then { loginRes -> Promise<(data: Data, response: URLResponse)> in
// loginRes contains new access token, set it to request "Authorization" header, and make the same request again
request.setValue(loginRes.accessToken, forHTTPHeaderField: "Authorization")
return URLSession.shared.dataTask(.promise, with: request)
}.map { session -> Data in
return session.data
}.compactMap { data -> Promise<T> in
try JSONDecoder().decode(T.self, from: data)
}
}

也许现在回答有点迟了,但我希望它能帮助一些像我一样刚接触 PromiseKit 的编码人员。

关于swift - 带有 URLSession 的 PromiseKit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58285240/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com