Kotlin ждут по порядку в параметрах? - PullRequest
1 голос
/ 15 января 2020

Ожидает ли Kotlin строго строго в порядке

  1. receient.await ()
  2. 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 проверяет сначала для receient.await () и только после того, как он завершает go для проверки для msg.await ()?

1 Ответ

3 голосов
/ 15 января 2020

Ваш вопрос не await -специфический c, и он гораздо глубже, вплоть до семантики порядка оценки самого Kotlin.

Итак, вот цитата из Kotlin спецификация языка :

Затем аргументы функции оцениваются в порядке их появления при вызове функции слева направо

Применяется к вашей строке кода:

sendEmail(recipient.await(), msg.await())

ясно, что сначала recipient.await() оценивается, а затем msg.await(). Вызов await() не завершится, пока не будет завершен рассматриваемый Deferred.

...