如何在 GlobalScope 之后排队 Coroutines viewModelScope 作业

How to enqueue Coroutines viewModelScope job after GlobalScope one

我有一个应用程序范围函数,它像这样从服务器请求访问令牌

fun getToken() {
    GlobalScope.launch {
        ...
        val response = webservice.getToken().awaitResponse()
        //save token
    }
}

我在存储库中也有函数,这些函数从服务器请求数据并从视图模型启动,就像这样

//in a ViewModel
fun getData() {
    viewModelScope.launch(Dispatchers.IO) {
        repository.getData()
    }
}

//in a Repository
fun getData() {
    ...
    val response = webservice.getData().awaitResponse()
    //handle response
}

如何让数据请求仅在有访问令牌可用时才发送?

我唯一想到的是在像这样的每个数据请求之前检查并请求令牌(如果需要)

fun getData() {
    var response: Response
    token?.let {
        response = webservice.getToken().awaitResponse()
        //save token
    }
    ...
    response = webservice.getData().awaitResponse()
    //handle response
}

但是当不同的存储库中有许多不同的数据请求时,这是正确的使用方法吗?

您可以这样做:

object InternalScope {
    private val tokenJob = GlobalScope.launch {
        response = webservice.getToken().awaitResponse()
    }

    suspend fun <T> runWithContext(
        context: CoroutineContext,
        block: suspend CoroutineScope.() -> T
    ): T {
        tokenJob.join()
        return withContext(context, block)
    }
}

您可以像这样使用它:

InternalScope.runWithContext(Dispatchers.IO){}