如何构建没有挂起功能的协程代码

How to struture coroutine code without suspend function

我有一个方法叫做 saveAccount

fun saveAccount(id: Int, newName: String): Account {
    val encryptedNames: List<String> = repository.findNamesById(id)
    val decryptedNames: List<String> = encryptedNames.map { cryptographyService.decrypt(it) }

    if(decryptedNames.contains(newName))
        throw IllegalStateException()

    return repository.save(newName)
}

我想同时解密所有名字,所以我做了:

suspend fun saveAccount(id: Int, newName: String): Account {
    val encryptedNames: List<String> = repository.findNamesById(id)

    val decryptedNames: List<String> = encryptedNames.map { 
        CoroutineScope(Dispatchers.IO).async {
            cryptographyService.decrypt(it) 
        } 
    }.awaitAll()

    if(decryptedNames.contains(newName))
        throw IllegalStateException()

    return repository.save(newName)
}

到现在为止一切都很好,但问题是:我无法使 saveAccount 成为挂起函数。我该怎么办?

因此,您想在单独的协程中解密每个名称,但 saveAccount 应该只 return 完成所有解密后。

你可以使用 runBlocking

fun saveAccount(id: Int, newName: String): Account {
    // ...
    val decryptedNames = runBlocking {
        encryptedNames.map {
            CoroutineScope(Dispatchers.IO).async {
                cryptographyService.decrypt(it) 
            }
        }.awaitAll()
    }
    // ...
}

这样 saveAccount 不必是 suspend 函数。