Сначала давайте определим, как обновляется токен:
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) Все последующие вызовы просто получатОтложено так же, как и при первом вызове, поэтому все запросы просто ждут обновления одного токена
3) Если токен есть, Отложенный разрешится, и все API будут повторяться (возможно, даже параллельно).