Связь родитель-ребенок сопрограммы, получение определенного ребенка и его отмена? - PullRequest
0 голосов
/ 11 июля 2020

У меня есть следующая функция приостановки

override suspend fun getStories(type: Int) {
    val job: Job = coroutineScope { 
        launch { 
            delay(20000)
        }
        
        launch {
            delay(50000)
        }
    }
}

Насколько я понимаю, сопрограмма Job может иметь потомков, которыми в данном случае будут две сопрограммы launch. Мой вопрос довольно простой. Как мне отменить сопрограмму delay (50000)?

Я запускал итератор в методе job.children (), но это не принесло результатов. Затем я проверил, есть ли у задания метод get для дочерних элементов. ??‍♂️

Дай мне знать, если это невозможно, или какой смысл детям, если я не могу получить к ним доступ для индивидуальной отмены вызова?

1 Ответ

1 голос
/ 11 июля 2020

На самом деле job.children действительно работает. Может быть, проблема в том, как, где и когда вы звоните. Этот код работает для меня:

fun main() = runBlocking {
    val job: Job = launch {
        launch {
            println("First job started")
            delay(3000)
            println("First job finished")
        }.invokeOnCompletion {
            println("First job completed!")
        }

        launch {
            println("Second job started")
            delay(4000)
            println("Second job finished")
        }.invokeOnCompletion {
            println("Second job completed!")
        }

        launch {
            println("Third job started")
            delay(5000)
            println("Third job finished")
        }.invokeOnCompletion {
            println("Third job completed!")
        }
    }

    delay(1000)
    job.children.elementAt(2).cancel()
    delay(750)
    job.children.elementAt(0).cancel()
    delay(500)
    job.children.elementAt(0).cancel()
}

Это результат:

First job started
Second job started
Third job started
Third job completed!
First job completed!
Second job completed!
...