مقدمة في قوائم المهام في TypeScript
\n\nقائمة المهام (task queue) هي إحدى هياكل البيانات الأساسية في البرمجة، والتي تعمل وفق مبدأ "من يأتي أولاً يُخدم أولاً" (FIFO). في TypeScript، تُستخدم قوائم المهام على نطاق واسع لإدارة العمليات غير المتزامنة، ومعالجة الطلبات، وتنظيم العمليات الخلفية، والعديد من السيناريوهات الأخرى.
\n\nفي هذه المقالة، سنشرح كيفية إنشاء واستخدام قوائم المهام في TypeScript من الصفر. ستتعلم كيفية تنفيذ قائمة أساسية، وإضافة الأولويات، ومعالجة الأخطاء. المحتوى موجه للمطورين المبتدئين الذين لديهم معرفة أساسية بـ TypeScript.
\n\nما هي قائمة المهام ولماذا نحتاجها؟
\n\nالقائمة هي قائمة مرتبة من العناصر، حيث يتم إضافة العناصر الجديدة في النهاية، ويتم الاستخراج من البداية. تخيل طابوراً في متجر: أول عميل يُخدم أولاً، والجدد يقفون في النهاية.
\n\nفي البرمجة، تُستخدم قوائم المهام من أجل:
\n\n- \n
- المعالجة غير المتزامنة — تنفيذ المهام في الخلفية دون حظر الخيط الرئيسي \n
- إدارة الحمل — الحد من عدد العمليات المنفذة في وقت واحد \n
- معالجة الأحداث — معالجة متسلسلة للطلبات الواردة \n
- جدولة المهام — تنفيذ المهام بتأخير أو وفق جدول زمني \n
تنفيذ قائمة مهام أساسية في TypeScript
\n\nإنشاء فئة القائمة
\n\nلنبدأ بتنفيذ بسيط لقائمة في TypeScript. سننشئ فئة TaskQueue تدعم العمليات الأساسية:
// task-queue.ts\ntype Task<T> = () => Promise<T>;\n\nclass TaskQueue<T> {\n private queue: Task<T>[] = [];\n private isProcessing = false;\n\n // إضافة مهمة إلى القائمة\n enqueue(task: Task<T>): void {\n this.queue.push(task);\n if (!this.isProcessing) {\n this.processQueue();\n }\n }\n\n // معالجة القائمة\n private async processQueue(): Promise<void> {\n this.isProcessing = true;\n\n while (this.queue.length > 0) {\n const task = this.queue.shift()!;\n try {\n const result = await task();\n console.log('تم تنفيذ المهمة:', result);\n } catch (error) {\n console.error('خطأ أثناء تنفيذ المهمة:', error);\n }\n }\n\n this.isProcessing = false;\n }\n\n // التحقق مما إذا كانت القائمة فارغة\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n // الحصول على حجم القائمة\n size(): number {\n return this.queue.length;\n }\n}\n\nاستخدام القائمة
\n\nالآن دعنا نرى كيفية استخدام فئتنا عملياً:
\n\n// example.ts\nconst taskQueue = new TaskQueue<string>();\n\n// إنشاء عدة مهام غير متزامنة\nconst task1 = async () => {\n await delay(1000);\n return 'تم تنفيذ المهمة الأولى';\n};\n\nconst task2 = async () => {\n await delay(500);\n return 'تم تنفيذ المهمة الثانية';\n};\n\nconst task3 = async () => {\n await delay(200);\n return 'تم تنفيذ المهمة الثالثة';\n};\n\n// إضافة المهام إلى القائمة\ntaskQueue.enqueue(task1);\ntaskQueue.enqueue(task2);\ntaskQueue.enqueue(task3);\n\n// دالة مساعدة\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n// النتيجة:\n// تم تنفيذ المهمة: تم تنفيذ المهمة الأولى (بعد 1ث)\n// تم تنفيذ المهمة: تم تنفيذ المهمة الثانية (بعد 1.5ث)\n// تم تنفيذ المهمة: تم تنفيذ المهمة الثالثة (بعد 1.7ث)\n\nقائمة متقدمة مع الأولويات
\n\nفي المشاريع الحقيقية، غالباً ما يكون من الضروري معالجة المهام بأولويات مختلفة. دعنا نوسع قائمتنا بإضافة دعم الأولويات:
\n\n// priorit