fun startAsyncFunc() {
launch {
asyncFunc1()
asyncFunc2()
}
}
fun asyncFunc1() { ... }
suspend fun asyncFunc2() { ... }
我可以在没有suspend
的情况下完成工作,它甚至可以使测试变得更加容易(可以在不添加runBlocking
的情况下进行测试。
我的问题:
asyncFunc1
与asyncFunc2
,这更好,为什么?asyncFunc2
更好,每当在协程中运行函数时,我是否应该始终使用suspend
?答案 0 :(得分:2)
asyncFunc2()
关键字表示协程可以被挂起以便以后执行。
话虽如此,您应该有意识地将它们用于将被挂起的协程(例如,您的suspend
进行了HTTP调用,正在等待响应以对其进行处理)
所以
suspend fun
用于将以某种方式延迟的功能(等待一些计算,api响应等)suspend
只能从协程运行。因此,如果将其暂停,它将阻塞协程。取出runBlocking
关键字,但是在协程中运行它,将具有相同的效果。但是,如果从协程外部运行此函数,它将阻塞正在其上运行的线程。测试协程时,应始终调用https
。如果不这样做,被暂停的协程可能不会完成,从而导致测试失败。
答案 1 :(得分:2)
suspend
关键字,函数本身可以调用其他挂起函数。使用关键字可能表明某些工作需要时间,因此可能需要暂停调用协程。suspend
关键字。仅出于1下给出的原因才需要该关键字。另一种方法是正确的:只能从协程调用挂起函数。答案 2 :(得分:2)
将suspend关键字用于:
将以某种方式延迟的功能(等待一些计算,网络请求)
经验法则是不要将功能暂停,除非您被迫
答案 3 :(得分:1)
仅在需要时声明函数suspend
。我会说,如果有疑问,如果编译器不强迫您,请不要使用suspend
。
大多数时候,如果您有充分的理由要暂停函数,则意味着它正在做某事,可能仍然需要您使用withContext
之类的暂停函数,这将迫使您声明您的函数suspend
。
请注意,声明函数suspend
不能使调用者做的事情比不暂停函数时要多。如果有的话,就限制了函数的使用。
我相信一个无需暂停就可以挂起函数的用例是,当您真正绝对要向世界展示您的函数在计算上很繁重时,从而迫使调用者应对挂起。
答案 4 :(得分:0)
来自docs:
暂停程序可以像常规函数一样在协程内部使用,但是它们的附加功能是它们可以依次使用其他暂停功能(如本示例中的delay)来暂停协程的执行。