Сопрограммное задание, возвращающее значение

#android #kotlin #kotlin-coroutines #coroutine

#Android #kotlin #kotlin-сопрограммы #сопрограмма

Вопрос:

Я пытаюсь сделать что-то подобное с сопрограммами Kotlin (это псевдокод):

 suspend fun myFunction() {
  if (job.isActive) {
    job.join()
    return job.result
  } else {
    job.start()
    job.join()
    return job.result
  }
}
  

В основном, чтобы иметь задание, которое выполняет некоторый код и возвращает значение. Затем функция использует это задание. Если задание не запущено, оно выполняет его и возвращает результаты. Если задание уже запущено, оно ожидает его завершения и возвращает свой результат.

Но не уверен, как подойти к этому. Есть предложения?

Ответ №1:

 class MyClass(override val coroutineContext: CoroutineContext) : CoroutineScope {
    private val lazyThing =
        async(start = CoroutineStart.LAZY) {
            5 // Calculate using suspending functions as necessary
        }

    suspend fun getThing() = lazyThing.await()
}
  

lazyThing в итоге получается Deferred<Int> . Его содержимое не будет вычислено до тех пор, пока не будет вызвано в первый раз getThing() . Оно будет вычислено только один раз, после чего его значение будет немедленно возвращено.

Ответ №2:

 import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext


fun main() {
    println(myFunction())
}

fun myFunction(): Int = runBlocking {
    aJobAsync().await()
}

suspend fun aJobAsync(): Deferred<Int> = withContext(Dispatchers.Default) {// use Dispatchers.IO for IO intensive task
    async {
        2   2
    }
}
  

aJobAsync — это вернет отложенное значение, которое может использоваться для извлечения возвращаемого значения заданий

myFunction — это блок блокировки выполнения, что означает, что при вызове myFunction вызывающий поток будет заблокирован. Поскольку нам нужна область сопрограммы для вызова ожидания в задании