ما الفرق بين launch/join و async/await في coroutines في Kotlin؟
مرحبًا! بدأت في تعلم coroutines في Kotlin وأشعر بالحيرة بين الطريقتين الرئيسيتين. عندما أكتب الكود، أرى أنه يمكن تشغيل coroutine عبر `launch` ثم انتظار اكتمالها باستخدام `join()`. وهناك أيضًا `async` مع `await()`. للوهلة الأولى، يبدو أنهما يفعلان نفس الشيء — تشغيل عمل في الخلفية وانتظار النتيجة. لكني أشعر أن هناك فرقًا، وأنه مهم.
إليك مثال بسيط أحاول فيه تحميل بيانات من مصدرين ودمجها. باستخدام launch/join، يصبح الكود هكذا:
```kotlin
fun main() = runBlocking {
var data1 = ""
var data2 = ""
val job1 = launch {
delay(1000) // محاكاة التحميل
data1 = "بيانات من API 1"
}
val job2 = launch {
delay(1000)
data2 = "بيانات من API 2"
}
job1.join()
job2.join()
println("$data1 + $data2") // يعمل، لكنه غير جميل
}
```
أما باستخدام async/await، فأفعل هكذا:
```kotlin
fun main() = runBlocking {
val deferred1 = async {
delay(10