Avatar ·

ما الفرق بين 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