Kotlin:如何调用可挂起的函数而不等待它的结果?

h5qlskok  于 2022-12-13  发布在  Kotlin
关注(0)|答案(1)|浏览(188)

我想在confirmPayment函数中触发一个名为initiateFulFillment的函数,但我不想在confirmPayment中等待initiateFulFillment的执行完成,这是因为confirmPayment的结果不依赖于initiateFulFillment的调用。
当我使用GlobalScope.launch触发initiateFulFillment时,它似乎起作用了,但我想知道这是否是实现我想要的东西的好方法,或者是否有更好的方法?
因为在我的IDE中,我收到一个警告,GloablScope是一个微妙的API,只有在必须使用它的时候才应该使用它。

fun confirmPayment(orderId: Int): Boolean {
    // * some validation *
    GlobalScope.launch {
        initiateFulFillment(orderId)
    }
    return true
}

suspend fun initiateFulFillment(orderId: Int) {
    // * initiating fulfillment *
}
guicsvcw

guicsvcw1#

由于GlobalScope通常用于执行应用程序生命周期内的工作,因此您确实不应该将其用于短时间或有限的任务,因为这些任务是特定于视图/活动/片段的。
使用作用域是很好的,所以你需要创建一个自定义的作用域。有很多方法可以创建和设置自定义的协程作用域,我将展示最简单的一个。

val customScope = CoroutineScope(Dispatchers.IO + SupervisorJob())

...

fun confirmPayment(orderId: Int): Boolean {
    // * some validation *
    customScope.launch {
        initiateFulFillment(orderId)
    }
    return true
}

UPD:您应该注意,如果此代码在某种视图模型中运行,并且用户离开屏幕,则可以清除范围,因此它不会等待工作完成。
UPD 2:我在我的例子中使用了IO dispatcher,它适用于网络调用。

相关问题