Уведомлять вакансии, когда другая работа заканчивается - PullRequest
0 голосов
/ 16 апреля 2019

В моем приложении для всех запросов нужен токен в виде http-заголовка авторизации, срок действия которого истекает через определенное время. При получении задания с сервера с кодом состояния 401 мне нужно запустить задание, чтобы обновить токен. Когда это задание завершено, мне нужно уведомить все задания из моего приложения, поскольку я не знаю, какое из них не удалось (задание стало выполненным, но с состоянием 401 http), и я должен повторить его с новым токеном.

Как я могу сделать это с сопрограммами?

1 Ответ

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

Сначала давайте определим, как обновляется токен:

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 будут повторяться (возможно, даже параллельно).

...