البرمجة الغير متزامنة هي مفهوم أساسي في لغات البرمجة الحديثة، وتوفر لغة دارت ميزات قوية للتعامل مع العمليات الغير متزامنة بشكل فعال. واحدة من هذه الميزات هي كلمتي async
و await
، التي تسمح للمطورين بكتابة كود غير متزامن يبدو ويتصرف ككود متزامن. وهذا يجعل الرمز أكثر قراءةً وسهولة في الفهم. في هذه المقالة، سنستكشف كلمتي async
و await
في لغة دارت ونتعلم كيفية استخدامهما بفاعلية.
فهم البرمجة الغير متزامنة
في العديد من التطبيقات، هناك مهام تستغرق وقتًا طويلاً لإكمالها، مثل استرجاع البيانات من الشبكة أو قراءة من ملف. في السابق، كان المطورون يستخدمون التعامل مع الاستدعاءات أو الوعود (Callbacks/Promises) للتعامل مع هذه العمليات الغير متزامنة. ومع ذلك، يمكن أن تؤدي هذه الأساليب إلى تعقيد الكود وجعله صعب القراءة والصيانة.
تقدم لغة دارت حلاً أكثر أناقة مع كلمتي async
و await
. عندما يتم تحديد الدالة بأنها async
، فإن ذلك يعني أنها ستقوم بعمل يستغرق وقتًا وسوف تعيد كائن Future
يحتوي على نتيجة هذا العمل. بالمقابل، تسمح لنا كلمة await
بإيقاف تنفيذ دالة async
حتى يتم إكمال الـ Future
المنتظر. وهذا يتيح لنا كتابة الكود الذي يبدو وكأنه متزامن ولكنه في الواقع غير متزامن.
استخدام كلمتي async
و await
لتحديد دالة كغير متزامنة، نستخدم كلمة async
قبل جسم الدالة. دعنا نلقي نظرة على مثال:
void main() { print("البدء"); fetchData(); print("النهاية"); } void fetchData() async { String data = await fetchDataFromServer(); print(data); } Future<String> fetchDataFromServer() { return Future.delayed(Duration(seconds: 2), () => "بيانات من الخادم"); }
في المثال أعلاه، لدينا دالة fetchData
محددة بأنها async
. تستدعي دالة fetchDataFromServer
التي تعيد Future
مع نتيجة مؤجلة. باستخدام كلمة await
قبل استدعاء fetchDataFromServer
تأخذ الدالة fetchData
استراحة في تنفيذها حتى يكتمل الـ Future
وتسترد النتيجة.
نتيجة الكود:
البدء النهاية بيانات من الخادم
كما ترون، على الرغم من أن دالة fetchDataFromServer
تحتوي على تأخير لمدة 2 ثانية، إلا أن البرنامج لا يتوقف ويستمر في تنفيذ المهام الأخرى. وهذه هي قوة async
و await
في لغة دارت.
التعامل مع الأخطاء
التعامل مع الأخطاء هو جانب أساسي في البرمجة الغير متزامنة. توفر لغة دارت طريقة بسيطة للتعامل مع الأخطاء في الدوال الغير متزامنة باستخدام عبارات try-catch
. دعنا نقوم بتعديل المثال السابق ليشمل التعامل مع الأخطاء:
void main() { print("البدء"); fetchData(); print("النهاية"); } void fetchData() async { try { String data = await fetchDataFromServer(); print(data); } catch (e) { print("خطأ: $e"); } } Future<String> fetchDataFromServer() { return Future.delayed(Duration(seconds: 2), () { throw Exception("خطأ في الشبكة"); }); }
في هذا المثال المعدلة، نقوم عمدًا بإلقاء استثناء داخل دالة fetchDataFromServer
. عبارات try-catch
في الدالة fetchData
تمتلك الاستثناء وتقوم بطباعة رسالة الخطأ.
نتيجة الكود:
البدء النهاية خطأ: Exception: خطأ في الشبكة
من خلال استخدام عبارات try-catch
، يمكننا التعامل بسهولة مع الأخطاء ومنعها من تعطيل تطبيقنا.
عبارات async
و await
في لغة دارت توفر طريقة قوية وقابلة للقراءة للتعامل مع العمليات الغير متزامنة. من خلال تحديد الدوال بأنها async
واستخدام كلمة await
، يمكننا كتابة كود يبدو متزامنًا وفعليًا يقوم بالمهام الغير متزامنة بكفاءة. بالإضافة إلى ذلك، تتيح لنا لغة دارت التعامل مع الأخطاء في الدوال الغير متزامنة باستخدام عبارات try-catch
، مما يضمن تعامل قوي وموثوق به للأخطاء في تطبيقاتنا.