在没有等待的情况下循环调用异步

时间:2019-12-06 16:37:00

标签: kotlin

我有一个函数集合,每个函数都使用异步调用。不使用等待(并且一定不能):

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
                }
            }
        }
    }

0 个答案:

没有答案