在我的应用程序中,所有请求都需要一个令牌作为http授权标头,该令牌在一定时间后到期。从服务器以401
状态代码获取作业时,我需要启动该作业以刷新令牌。完成此作业后,我需要从应用程序中通知所有作业,因为我不知道其中哪些失败(作业已完成,但具有401 http状态),我必须使用新令牌重试。
我该如何使用协同程序?
答案 0 :(得分:0)
首先,让我们定义令牌的刷新方式:
1)如果还没有刷新令牌的请求,请重新启动令牌。
2)如果已经发生,请等待。
在Kotlin中,可以这样写:
var retrieveToken : Deferred<String>? = null
suspend fun getToken(refresh: Boolean = false): String {
if(retrieveToken == null || refresh && !retrieveToken.isActive)
retrieveToken = async { API.getToken() }
return retrieveToken.await()
}
现在重试API变得非常简单:
suspend fun requestAPIAndRetry(api: String) {
try {
val token = getToken()
val result = API.call(api, token)
} catch(error) {
// verifiy if it is 401
val token = getToken(refresh = true)
var result = API.call(api, token)
}
}
现在,如果请求开始失败,则会发生以下情况:
1)对getToken(refresh = true)
的首次调用将启动对API的请求并将其返回。
2)接下来的所有调用都将与第一次调用具有相同的Deferred,因此所有请求都只等待一个令牌更新
3)如果令牌存在,则Deferred将解决,所有API将重试(甚至可以并行)。