قوائم المهام في TypeScript: دليل شامل للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في قوائم المهام في TypeScript

\n\n

قائمة المهام (task queue) هي إحدى هياكل البيانات الأساسية في البرمجة، والتي تعمل وفق مبدأ "من يأتي أولاً يُخدم أولاً" (FIFO). في TypeScript، تُستخدم قوائم المهام على نطاق واسع لإدارة العمليات غير المتزامنة، ومعالجة الطلبات، وتنظيم العمليات الخلفية، والعديد من السيناريوهات الأخرى.

\n\n

في هذه المقالة، سنشرح كيفية إنشاء واستخدام قوائم المهام في TypeScript من الصفر. ستتعلم كيفية تنفيذ قائمة أساسية، وإضافة الأولويات، ومعالجة الأخطاء. المحتوى موجه للمطورين المبتدئين الذين لديهم معرفة أساسية بـ TypeScript.

\n\n

ما هي قائمة المهام ولماذا نحتاجها؟

\n\n

القائمة هي قائمة مرتبة من العناصر، حيث يتم إضافة العناصر الجديدة في النهاية، ويتم الاستخراج من البداية. تخيل طابوراً في متجر: أول عميل يُخدم أولاً، والجدد يقفون في النهاية.

\n\n

في البرمجة، تُستخدم قوائم المهام من أجل:

\n\n
    \n
  • المعالجة غير المتزامنة — تنفيذ المهام في الخلفية دون حظر الخيط الرئيسي
  • \n
  • إدارة الحمل — الحد من عدد العمليات المنفذة في وقت واحد
  • \n
  • معالجة الأحداث — معالجة متسلسلة للطلبات الواردة
  • \n
  • جدولة المهام — تنفيذ المهام بتأخير أو وفق جدول زمني
  • \n
\n\n

تنفيذ قائمة مهام أساسية في TypeScript

\n\n

إنشاء فئة القائمة

\n\n

لنبدأ بتنفيذ بسيط لقائمة في TypeScript. سننشئ فئة TaskQueue تدعم العمليات الأساسية:

\n\n
// 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                

المدونات

توصيات الكتب