另一工作完成时通知工作

时间:2019-04-16 08:37:28

标签: kotlin jobs kotlin-coroutines

在我的应用程序中,所有请求都需要一个令牌作为http授权标头,该令牌在一定时间后到期。从服务器以401状态代码获取作业时,我需要启动该作业以刷新令牌。完成此作业后,我需要从应用程序中通知所有作业,因为我不知道其中哪些失败(作业已完成,但具有401 http状态),我必须使用新令牌重试。

我该如何使用协同程序?

1 个答案:

答案 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将重试(甚至可以并行)。