Kotlin 在循环中调用异步而不等待
我有一个函数集合,每个函数都使用异步调用。未使用等待(且不得使用):Kotlin 在循环中调用异步而不等待,kotlin,Kotlin,我有一个函数集合,每个函数都使用异步调用。未使用等待(且不得使用): 这段代码的问题在于,因为使用循环来启动每个异步,所以变量testInfo位于异步内部,并且在每次处理循环时都可能被覆盖。我想做的是将async移动到一个函数,并调用该函数。大概是这样的: fun runTests() { GlobalScope.launch { for (testSetup in testSetupClasses) { val setup = testSetup
这段代码的问题在于,因为使用循环来启动每个异步,所以变量testInfo位于异步内部,并且在每次处理循环时都可能被覆盖。我想做的是将async移动到一个函数,并调用该函数。大概是这样的:
fun runTests() {
GlobalScope.launch {
for (testSetup in testSetupClasses) {
val setup = testSetup()
runningSetups.add(setup)
for (test in setup.tests) {
val testInfo = test.value
runTestAsync(testInfo)
}
}
}
}
suspend fun runTestAsync(testInfo: TestInfo) {
async {
testInfo.getTestToRunAsync()?.invoke { testResult ->
testInfo.testResult = testResult
}
}
}
不幸的是,runTestAsync中的async未解析。我怎样才能解决这个问题?我能想到的一个解决方案是在函数中添加GlobalScope.launch,但这看起来有点难看,如果我对函数有很多调用,我不确定这是否是一个主要的性能问题:
suspend fun runTestAsync(testInfo: TestInfo) {
GlobalScope.launch {
async {
testInfo.getTestToRunAsync()?.invoke { testResult ->
testInfo.testResult = testResult
}
}
}
}
“可能被覆盖”我不这么认为。
GlobalScope.async
…为什么不?异步代码以异步方式运行。当循环移动到下一个项目,并且上一个异步直到稍后的循环迭代才结束时,testInfo变量将发生更改。或者你是说它不会改变?不,我不这么认为。我希望每次调用async
都能从循环的迭代中捕获一个新初始化的本地val testInfo
。
suspend fun runTestAsync(testInfo: TestInfo) {
GlobalScope.launch {
async {
testInfo.getTestToRunAsync()?.invoke { testResult ->
testInfo.testResult = testResult
}
}
}
}