我有一个函数集合,每个函数都使用异步调用。不使用等待(并且一定不能):
fun runTests() {
GlobalScope.launch {
for (testSetup in testSetupClasses) {
val setup = testSetup()
runningSetups.add(setup)
for (test in setup.tests) {
val testInfo = test.value
async {
testInfo.getTestToRunAsync()?.invoke { testResult ->
testInfo.testResult = testResult
}
}
}
}
}
}
此代码的问题在于,因为使用了循环来启动每个异步,所以变量testInfo位于异步内部,因此每次处理循环时,该变量都有可能被覆盖。我想做的是将异步移动到一个函数,然后调用该函数。像这样:
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中的异步未解析。我怎样才能解决这个问题?我能想到的一个解决方案是在函数中添加GlobalScope.launch,但这看起来很难看,如果我对该函数进行了很多调用,我不确定这是否是主要的性能问题:
suspend fun runTestAsync(testInfo: TestInfo) {
GlobalScope.launch {
async {
testInfo.getTestToRunAsync()?.invoke { testResult ->
testInfo.testResult = testResult
}
}
}
}