إنشاء Streams باستخدام async*
ولّد الأحداث من مولّد
إنشاء Streams باستخدام async* درس مجاني في Dart Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Dart Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Dart Academy 4 دروس في المجموع.
إنتاج Streams الخاصة بك
حتى الآن كنت تستهلك streams أنشأها آخرون. والآن ستنتجها بنفسك باستخدام مولّد async، وهي الطريقة الأنظف لإصدار الأحداث.
الكلمة المفتاحية async*
علّم دالةً بـ async*، فتصبح مولّدًا لـ stream. ويكون نوع إرجاعها Stream، ويمكنها إصدار القيم بمرور الوقت. 🚿
Stream<int> countTo(int n) async* {
// body uses yield
}يصدر yield قيمة
داخل دالة async*، يرسل yield قيمة واحدة إلى stream. ويتوقف التنفيذ عنده مؤقتًا حتى يصبح المستمع مستعدًا للمزيد.
Stream<int> oneTwo() async* {
yield 1;
yield 2;
}استخدام yield داخل حلقة
اجمع بين yield وحلقة لإصدار قيم متعددة. ففي كل دورة تُرسل الحلقة الرقم التالي إلى stream تلقائيًا.
Stream<int> countTo(int n) async* {
for (var i = 1; i <= n; i++) yield i;
}استخدام await داخل async*
لأن الدالة غير متزامنة، يمكنك استخدام await بين عبارات yield. ويتيح لك ذلك جلب البيانات أو الانتظار قبل إصدار الحدث التالي.
Stream<int> ticker() async* {
while (true) {
await Future.delayed(Duration(seconds: 1));
yield DateTime.now().second;
}
}يمرر yield* Stream
استخدم yield* لإصدار كل حدث من stream آخر داخل المولّد. فهو يدرج stream كاملًا داخل stream الخاص بك.
Stream<int> combined() async* {
yield* countTo(3);
yield 99;
}كسول حتى يبدأ الاستماع
لا تبدأ دالة async* في العمل حتى يستمع إليها أحد. ولا يُنفّذ جسمها إلا عندما يسحب المستمع كل قيمة. ⏸️
يحترم الإيقاف المؤقت المستمع
إذا أوقف المستمع مؤقتًا، يتوقف المولّد مؤقتًا أيضًا عند عبارة yield التالية. ويمنع هذا الضغط العكسي المنتجين من إغراق المستهلكين.
الأخطاء من async*
يتحول استخدام throw داخل دالة async* إلى حدث خطأ في stream. ويمكن للمستمعين التقاطه مثل أي خطأ آخر في stream.
Stream<int> risky() async* {
yield 1;
throw 'boom';
}استهلاك المولّد الخاص بك
اقرأ stream الذي أنشأته بالطريقة المعتادة باستخدام await for. وتتدفق كل قيمة صادرة عبر yield إلى الحلقة بالترتيب.
await for (final n in countTo(3)) {
print(n);
}async* مقابل StreamController
بالنسبة إلى المخرجات المتسلسلة المعتمدة على السحب، يكون async* أبسط من StreamController. ولا تلجأ إلى controller إلا عندما تأتي الأحداث من دوال رد الاتصال الخارجية.
اختبار سريع
كيف تصدر قيمة من دالة async*؟
مراجعة
أنشأت streams باستخدام async*، وأرسلت القيم عبر yield، ومرّرت القيم باستخدام yield*، وانتظرت بين الأحداث. يمكنك الآن استهلاك streams وإنتاجها أيضًا. 🎉
الأسئلة الشائعة
هل درس «إنشاء Streams باستخدام async*» مجاني؟
نعم — نص درس «إنشاء Streams باستخدام async*» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Dart Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Dart Academy 4 دروس في المجموع.
ماذا ستتعلم في «إنشاء Streams باستخدام async*»؟
ولّد الأحداث من مولّد تتمرن على Dart Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Dart Academy؟
لا تُشترط خبرة سابقة. Dart Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «إنشاء Streams باستخدام async*»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Dart Academy هذا؟
نعم. كل درس في Dart Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الاستماع باستخدام await for
- Streams أحادية البث في مقابل Streams المذاعة
- تحويل Streams: map وwhere وtake
- إنشاء Streams باستخدام async*