Kotlin 是否按参数顺序等待?
Does Kotlin await in order in parameters?
Kotlin 是否严格按顺序等待
- recipient.await()
- msg.await()
第 7 行:
suspend fun sendEmail(r: String, msg: String): Boolean { //(6)
delay(2000)
println("Sent '$msg' to $r")
return true
}
suspend fun getReceiverAddressFromDatabase(): String { //(4)
delay(1000)
return "coroutine@kotlin.org"
}
suspend fun sendEmailSuspending(): Boolean {
val msg = async(CommonPool) { //(3)
delay(500)
"The message content"
}
val recipient = async(CommonPool) { //(5)
getReceiverAddressFromDatabase()
}
println("Waiting for email data")
val sendStatus = async(CommonPool) {
sendEmail(recipient.await(), msg.await()) //(7)
}
return sendStatus.await() //(8)
}
或者以任何顺序?我的意思是 Kotlin 是否首先检查 recipient.await() 并且只有在它完成后才去检查 msg.await()?
您的问题不是 await
特定的,而是更深入的问题,深入到 Kotlin 本身的评估顺序语义。
所以,这里引用 Kotlin language specification:
Function arguments are then evaluated in the order of their appearance in the function call left-to-right
应用于您的代码行:
sendEmail(recipient.await(), msg.await())
很明显,首先评估recipient.await()
,然后评估msg.await()
。在相关 Deferred
完成之前,await()
调用不会完成。
Kotlin 是否严格按顺序等待
- recipient.await()
- msg.await()
第 7 行:
suspend fun sendEmail(r: String, msg: String): Boolean { //(6)
delay(2000)
println("Sent '$msg' to $r")
return true
}
suspend fun getReceiverAddressFromDatabase(): String { //(4)
delay(1000)
return "coroutine@kotlin.org"
}
suspend fun sendEmailSuspending(): Boolean {
val msg = async(CommonPool) { //(3)
delay(500)
"The message content"
}
val recipient = async(CommonPool) { //(5)
getReceiverAddressFromDatabase()
}
println("Waiting for email data")
val sendStatus = async(CommonPool) {
sendEmail(recipient.await(), msg.await()) //(7)
}
return sendStatus.await() //(8)
}
或者以任何顺序?我的意思是 Kotlin 是否首先检查 recipient.await() 并且只有在它完成后才去检查 msg.await()?
您的问题不是 await
特定的,而是更深入的问题,深入到 Kotlin 本身的评估顺序语义。
所以,这里引用 Kotlin language specification:
Function arguments are then evaluated in the order of their appearance in the function call left-to-right
应用于您的代码行:
sendEmail(recipient.await(), msg.await())
很明显,首先评估recipient.await()
,然后评估msg.await()
。在相关 Deferred
完成之前,await()
调用不会完成。