Junior — Middle
შესაძლებელია თუ არა launch ფუნქციის შესრულების შედეგის სინქრონული მიღება?
sobes.tech AI
პასუხი AI-სგან
Kotlin Coroutines- ում launch ֆունկցիան սկսում է նոր coroutine և անմիջապես վերադարձնում է Job օբյեկտը: Այն չի բլոկավորում ընթացիկ հոսքը և չի վերադարձնում այն ֆունկցիայի արդյունքը, որը սկսում է: Անհնար է ստանալ launch-ից արդյունքը սինխրոն կերպով, քանի որ launch նախատեսված է այն գործառույթների համար, որոնք արժեքներ չեն վերադարձնում:
Եթե անհրաժեշտ է ստանալ ասինխրոն օպերացիայի արդյունքը, պետք է օգտագործել async, որը վերադարձնում է Deferred<T>. Այնուհետև կարող եք կանչել await()-ը արդյունքը ստանալու համար, բայց await()-ը սուսպենդ (suspend) ֆունկցիա է և չի բլոկավորում հոսքը, միայն դադարեցնում է coroutine-ը:
Օրինակ՝
val job = launch {
// ասինխրոն գործառույթ
}
// job չի պարունակում արդյունք
val deferred = async {
// հաշվարկ՝ արդյունքով
42
}
runBlocking {
val result = deferred.await() // արդյունքը ստանալ
println(result) // 42
}
Այսպիսով, launch-ից արդյունքը սինխրոն ստանալ հնարավոր չէ, դրա համար օգտագործվում է async + await։