البرمجة التفاعلية في JavaScript (Node.js) باستخدام RxJS
\n\nالبرمجة التفاعلية هي نموذج يركز على تدفقات البيانات غير المتزامنة ونشر التغييرات. في بيئة JavaScript (Node.js)، تعد RxJS (الإضافات التفاعلية لـ JavaScript) واحدة من أقوى المكتبات لتنفيذ هذا النموذج. توفر أدوات للعمل مع Observable (التسلسلات القابلة للملاحظة)، مما يسمح للمطورين بمعالجة الأحداث وطلبات HTTP والمؤقتات ومصادر البيانات غير المتزامنة الأخرى بكفاءة.
\n\nالمفاهيم الأساسية لـ RxJS
\nتعتمد RxJS على ثلاثة مكونات رئيسية:
\n- \n
- Observable (كائن قابل للملاحظة) — يمثل تدفق بيانات يمكنه توليد قيم بمرور الوقت. \n
- Observer (المراقب) — كائن يشترك في Observable ويستجيب لوصول بيانات جديدة (next) أو أخطاء (error) أو إنهاء التدفق (complete). \n
- Subscription (الاشتراك) — نتيجة استدعاء طريقة
subscribe(). يسمح بإدارة دورة حياة الاشتراك (مثل إلغائه). \n
كما تلعب العوامل (operators) دورًا مهمًا — وهي دوال نقية تسمح بتحويل وتصفية ودمج وجمع تدفقات البيانات.
\n\nالتثبيت والإعداد
\nلاستخدام RxJS في مشروع Node.js، يكفي تثبيت الحزمة عبر npm:
\nnpm install rxjs\nبعد التثبيت، المكتبة جاهزة للاستخدام. قم باستيراد المكونات المطلوبة:
\nconst { Observable, of, from, interval } = require('rxjs');\nconst { map, filter, take } = require('rxjs/operators');\n\nإنشاء Observable
\nهناك عدة طرق لإنشاء تدفقات البيانات. دعنا نستعرض الأساسيات:
\n\n1. الإنشاء من مصفوفة
\nconst { from } = require('rxjs');\n\nconst numbers$ = from([1, 2, 3, 4, 5]);\nnumbers$.subscribe({\n next: value => console.log(`تم الاستلام: ${value}`),\n complete: () => console.log('تم إنهاء التدفق')\n});\nنتيجة التنفيذ:
\nتم الاستلام: 1\nتم الاستلام: 2\nتم الاستلام: 3\nتم الاستلام: 4\nتم الاستلام: 5\nتم إنهاء التدفق\n\n2. توليد قيم دورية
\nconst { interval } = require('rxjs');\nconst { take } = require('rxjs/operators');\n\nconst timer$ = interval(1000).pipe(\n take(4) // نقتصر على 4 قيم\n);\n\ntimer$.subscribe({\n next: value => console.log(`نقرة ${value}`),\n complete: () => console.log('تم إنهاء المؤقت')\n});\nالإخراج (بفاصل زمني قدره 1 ثانية):
\nنقرة 0\nنقرة 1\nنقرة 2\nنقرة 3\nتم إنهاء المؤقت\n\nالعمل مع العوامل (Operators)
\nالعوامل هي قلب RxJS. تسمح بتحويل البيانات أثناء التدفق. دعنا نستعرض عاملين شائعين:
\n- \n
map— يحول كل قيمة في التدفق. \n filter— يمرر فقط القيم التي تفي بالشرط. \n
const { of } = require('rxjs');\nconst { map, filter } = require('rxjs/operators');\n\nconst source$ = of(1, 2, 3, 4, 5, 6);\n\nsource$.pipe(\n filter(value => value % 2 === 0), // نترك فقط الأعداد الزوجية\n map(value => value * 10) // نضرب كل قيمة في 10\n).subscribe({\n next: value => console.log(`النتيجة: ${value}`),\n complete: () => console.log('تم')\n});\nالنتيجة:
\nالنتيجة: 20\nالنتيجة: 40\nالنتيجة: 60\nتم\n\nمعالجة الأخطاء في التدفقات التفاعلية
\nيوفر RxJS آليات مدمجة لمعالجة الأخطاء. على سبيل المثال، العامل catchError يسمح باعتراض الاستثناء ومواصلة التنفيذ:
const { throwError, of } = require('rxjs');\nconst { catchError } = require('rxjs/operators');\n\nconst error$ = throwError(() =>