تحذير
لا تقم بتثبيت هذه الحزمة كاعتماد! (انظر: البدء)
في الوقت الحالي ، تعد الوعود طريقة غير فعالة للتعامل مع المهام غير المتزامنة في JavaScript ، وبسبب ذلك ، فهي جزء أساسي من معرفة أي مطور JavaScript.
ومع ذلك ، عندما نتعلم الوعود لأول مرة ، نتعلم فقط ما يكفي للحصول على ، أي أننا نتعلم القليل من كيفية استخدام الوعود ، (في الوقت الحاضر ، على الأرجح مع async/await فقط) ، Promise.all .
على الرغم من أن هذا النهج أمر منطقي بالنسبة للمبتدئين لأنه يكفي حل معظم المشكلات في حياتهم اليومية ، إلا أن القضية المتكررة هي أنهم يتوقفون عند هذا الحد ، أي أنهم لا يتجاوزون هذه المعرفة الأولية.
وهذا هو بالضبط الموقف "تعلم ما يكفي للحصول على" الذي يحمل العديد من المطورين في مستواهم الحالي ، لأن حل المشكلات الأكثر تعقيدًا يتطلب فهمًا أعمق.
لذلك ، إذا كنت ترغب في نقل مهارات المطورين الخاصة بك إلى المستوى التالي ، فلن تقطعها السباحة في المياه الضحلة ، فيجب أن تتعمق أكثر ، فأنت بحاجة إلى فهم الوعود تمامًا ، وكيف تعمل ، يجب أن تكون بارعًا في كل من المتزامن then/catch async/await أنماط الوعد الممكنة.
أيضًا ، نظرًا لأن الوعود هي في النهاية تجريد للتعامل مع المهام غير المتزامنة ، فإن القدرة على معالجة المشكلات الشائعة المتعلقة بالبرمجة غير المتزامنة أمر لا بد منه.
مع وضع ذلك في الاعتبار ، أنشأنا هذا المشروع على وجه التحديد لمساعدتك في القيام بهذا الغوص العميق في الوعود والبرمجة غير المتزامنة.
من خلال توفير كل من التفسيرات والتمارين العملية المحيطة بهذه المواضيع ، يهدف هذا المشروع إلى أن يكون رفيقك في هذه الرحلة لإتقانهم.
حتى لو كنت بالفعل مطورًا محنكًا ، فقد تتعلم شيئًا أو اثنين ، على سبيل المثال ، قد ترغب في محاولة حل concrete/parallelMaxConcurrency ، concrete/concurrencyOverride ، concrete/extractingResolvers و /foundation/promise مع وجود بعض التحديات المثيرة للاهتمام.
مهم
هذا المشروع ليس مخصصًا للأشخاص الذين يتعلمون الوعود لأول مرة ، لأنه يفترض أن لديك على الأقل بعض المعرفة الأساسية بالوعود ، وما يمثلونه وكيفية استخدامها مع async/await then/catch .
تحذير
الانتباه: لا يُقصد من هذا الريبو أن يتم استنساخه إلا إذا كنت تساهم إذا كنت مستخدمًا نهائيًا ، يرجى اتباع الإرشادات أدناه
أولاً ، لتثبيت المشروع ، تشغيل:
npm create promises-training@latestملحوظة
هذا المشروع يحركه التمرين ، وبالتالي فإن الهدف الرئيسي هو حلها.
في بعض الأحيان ، ستكون هناك تفسيرات جنبًا إلى جنب مع التمارين لمساعدتك على فهم ما يجب القيام به ، وكذلك بعض السياق حول المشكلة التي يتم حلها.
تنقسم التمارين إلى ثلاث فئات:
مهم
لا يوجد طلب محدد للفئات ، يمكنك البدء من أي منها والتحول إلى آخر حتى قبل الانتهاء من الآخر تمامًا. ومع ذلك ، فإن التمارين لها مستويات مختلفة ستتم مناقشتها بعد ذلك.
تقع التمارين داخل مجلدات src/exercises/<category> ، حيث <category> هي واحدة من الفئات المذكورة أعلاه.
بالنسبة لتمارين الرسم البياني ، توجد التفسيرات الأساسية في هذا ReadMe ، في قسم الرسم البياني ، ولكل تمرين ، هناك graph.png يصور الرسم البياني التبعي لهذا التمرين المحدد.
بالنسبة للتمارين الخرسانية والأساس ، توجد التفسيرات في README.md داخل مجلد التمرين (على سبيل المثال src/exercises/concrete/parallelChunks/README.md ).
لحل التمرين ، تحتاج إلى تحرير ملف src/exercises/<category>/<exercise>/exercise.ts .
بعد حل التمرين ، يمكنك التحقق من الحل الخاص بك عن طريق التشغيل:
npm run check < category > / < exercise > توجد الاختبارات داخل src/tests .
عمومًا ، ستعمل فقط داخل مجلد التدريبات حيث يتم وضع اختبارات بطريقة تخبرك بالضبط بما حدث بالضبط دون الاضطرار إلى النظر في تنفيذها ، ولكن إذا كنت تتعثر أو فضوليًا ، فقد تعلق عليهم.
المجلد src/lib مخصص للاستخدام الداخلي فقط ، لذلك لا تهتم به.
أيضًا ، للحفاظ على التثبيت إلى الأمام المتوافقة مع الإصدارات المستقبلية ، لا تقم بتعديل أي ملف خارج مجلد src/exercises .
إلى جانب الفئات ، تنقسم التمارين أيضًا إلى مستويات ، حيث تزداد التمارين في الصعوبة مع تقدمك من خلال المستويات.
هناك ثلاثة مستويات:
ضع في اعتبارك أن هذا التصنيف شخصي إلى حد ما ، لذلك لا تحتاج بالضرورة إلى إكمال جميع التمارين في مستوى للانتقال إلى التمارين التالية.
ملحوظة
كما ترون ، في الوقت الحالي ، لا توجد العديد من التمارين المتقدمة ، ولكن الفكرة هي أن التمارين الجديدة ستضاف مع مرور الوقت.
يرافق كل تمرين اختبارات آلية بحيث يمكنك التحقق من الحل الخاص بك.
لإجراء اختبارات تمرين واحد ، قم بتشغيل:
npm run check < category > / < exercise > على سبيل المثال ، لتشغيل اختبارات تمرين parallelChunks ، قم بالتشغيل:
npm run check concrete/parallelChunksأو ، لتشغيل تمرين الرسم البياني رقم 2 ، تشغيل:
npm run check graph/2/test.test.tsملحوظة
في المثال السابق ، كنا بحاجة 2 إلحاق /test.test.ts
نحن نستخدم Vitest كعداء اختبار ، لذلك تتوفر جميع خيارات CLI الخاصة به.
أيضًا ، من المهم أن نذكر أن تمارين الرسم البياني لها بعض الخصائص ، بمعنى أنها يتم إنشاؤها تلقائيًا من الرسم البياني نفسه ، ولهذا السبب ، فإن بعض التمارين لديها عدد كبير من الاختبارات (بعض التمارين لديها أكثر من 100 ألف اختبار).
بالطبع ، نحن لا نديرها جميعًا لأنها ستكون بطيئة بشكل محظور ، لذلك نحن فقط ندير مجموعة فرعية منها ، ومن الممكن تعديل عدد الاختبارات التي يتم تشغيلها وأيضًا المجموعة الفرعية .
يمكنك قراءة المزيد في قسم تمارين الرسم البياني.
حاليا ، هناك ثلاث فئات تمرين:
جزء كبير من التعامل مع المهام غير المتزامنة هو تنظيمها بحيث تبدأ كل مهمة في أسرع وقت ممكن ، ولأن تنظيم هذه المهام بشكل صحيح نحتاج إلى فهم علاقات التبعية بينهما.
في هذه الفئة ، سيتم تقديم رسم بياني للاعتماد في كل تمرين ، وبعد ذلك ستقوم بتنظيم المهام في الرسم البياني بأكثر الطرق كفاءة ممكنة.
نظرًا لأن التمرين يركز على التزامن نفسه ، يتم إنشاء المهام عن طريق استدعاء createPromise(label) ، حيث تكون label عبارة عن سلسلة تحدد المهمة.
خذ هذا الرسم البياني ، على سبيل المثال:

هناك مهمتان في هذا الرسم البياني ، A و B ، و B يعتمد على A ، ويمثله السهم الذي يخرج من B ويشير إلى A
هذا يعني أنه لا يمكن أن تبدأ B إلا بعد انتهاء A ويمكن أن تبدأ A ، لأنها لا تعتمد على أي مهمة أخرى ، على الفور.
وبالتالي ، فإن التنفيذ الأكثر كفاءة لهذا الرسم البياني سيكون:
await createPromise ( "A" ) ;
await createPromise ( "B" ) ;يمكن أن تعتمد المهام أيضًا على أكثر من مهمة واحدة:

في هذا الرسم البياني ، يعتمد C على كل من A و B ، بحيث لا يمكن أن تبدأ إلا بعد انتهاء A و B
ومع ذلك ، لا يعتمد كل من A و B على أي مهمة أخرى ، حتى يتمكنوا من البدء على الفور.
سيكون التنفيذ الأكثر كفاءة لهذا الرسم البياني هو:
await Promise . all ( [ createPromise ( "A" ) , createPromise ( "B" ) ] ) ;
await createPromise ( "C" ) ;يمكن أن تحتوي المهام أيضًا على مجموعات مختلفة من التبعيات حيث ، إذا تم استيفاء أي من المجموعات ، عندها يمكن أن تبدأ المهمة:

في هذا الرسم البياني ، يعتمد C إما على A أو ON على B ، والذي يتم تمثيله باستخدام ألوان مختلفة لكل مجموعة تبعية. الألوان نفسها ليس لها أي معنى محدد ، فهي تستخدم مثل هذا فقط حتى يتم تمييز التبعيات عن بعضها البعض.
لذلك ، يمكن أن تبدأ C بمجرد انتهاء A أو B
await Promise . any ( [ createPromise ( "A" ) , createPromise ( "B" ) ] ) ;
await createPromise ( "C" ) ;أخيرًا وليس آخرًا ، يكون للوعود نتيجتين محتملين: يمكن الوفاء بها أو رفضها.

في هذا الرسم البياني ، لدينا المهمة B التي تعتمد على تحقيق A والمهمة C التي تعتمد على رفض A
مهم
يتم استخدام الحواف المتقطعة لتمثيل رفض الوعد.
هذا يعني أنه لا يمكن أن يبدأ B إلا بعد الوفاء A ولا يمكن أن يبدأ C إلا بعد رفض A
نظرًا لوجود واحد فقط من هذه النتائج ، سيتم تنفيذ B أو C
التنفيذ المقابل:
try {
await createPromise ( "A" ) ;
try {
await createPromise ( "B" ) ;
} catch { }
} catch {
await createPromise ( "C" ) ;
} عند القيام بتمارين الرسم البياني ، ستلاحظ أنه يتم تصدير ثلاث وظائف: mixed ، asyncAwait ، thenCatch .
الفكرة هي أن تقدم 3 تطبيقات مختلفة:
mixed : هذا واحد مجاني تمامًا ، يمكنك مزج كل من Async/في الانتظار ثم/تصطاد ،asyncAwait : في هذا واحد يجب عليك فقط استخدام Async/تنتظرthenCatch : في هذا واحد يجب عليك فقط استخدامه/catch.وبهذه الطريقة ستكون بارعًا في كلا أساليب التعامل مع الوعد.
أيضًا ، في نهاية الملف ، ستلاحظ أن الصادرات يتم لفها في skipExercise ، والتي تتخطى اختبارات هذا التنفيذ المحدد بحيث لا تتخلى عن الإخراج.
أثناء تنفيذ حل لكل من هؤلاء الثلاثة ، قم بإزالة مكالمة skipExercise للتنفيذ الذي تريد إجراء الاختبارات. على سبيل المثال: إذا قمت بالفعل بتطبيق الحل mixed ، فقم بإزالة skipExercise منه ولكن احتفظ بالألعاب asyncAwait و thenCatch حتى تنفذها.
لمساعدتك في تصحيح تنفيذي لتمارين الرسم البياني ، أنشأنا واجهة مستخدم يتيح لك محاكاة "مسارات" التنفيذ المختلفة.
لفتح واجهة المستخدم ، قم بتشغيل:
npm run graph:uiيتم تقديم واجهة المستخدم كتطبيق ويب ويبدو مثل هذا.

الآن دعونا نستكشف كل قسم:

يتيح لك الشريط الجانبي على اليسار تحديد التمرين الذي تريد تصحيحه.

يتيح لك هذا القسم العلوي تحديد التنفيذ الذي تريد تصحيحه.

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

يعرض هذا القسم في المركز سجلات الوعود التي تم إنشاؤها وحلها/رفضها في كل خطوة.

يوضح هذا القسم في الأسفل ملخصًا للوعود التي تم حلها/رفضها في كل خطوة ، بالترتيب.
نظرًا لأن تمارين الرسم البياني تستند إلى الرسوم البيانية (DUH) ، فمن الممكن إنشاء جميع الاختبارات الممكنة لتمرين معين تلقائيًا ، وهو ما نقوم به.
كما قد يتخيل المرء ، يكون عدد الاختبارات التي تم إنشاؤها ضخمة في بعض الأحيان ، لذلك لدينا غطاء على الحد الأقصى لعدد الاختبارات التي يتم تشغيلها.
أيضًا ، لمنع التحيزات ، لا نجري اختبارات بالترتيب الذي تم إنشاؤه ، بدلاً من ذلك ، نخلفها .
يحدث هذا الاختلاط مباشرة بعد إنشاء الاختبارات أولاً ، بحيث تكون الاختبارات حتمية ، أي في كل مرة تقوم فيها بتشغيل اختبارات تمارين الرسم البياني ، ستقوم بتشغيل نفس المجموعة الفرعية من الاختبارات.
ومع ذلك ، فمن الممكن تعديل كل من الغطاء والمجموعة الفرعية من الاختبارات التي يتم تشغيلها.
لتعديل الغطاء ، يمكنك تشغيل npm run graph:setGraphTestsCap <number> .
على سبيل المثال ، لتعيين الحد الأقصى إلى 10000 ، قم بتشغيل:
npm run graph:setGraphTestsCap 10000 لتعديل المجموعة الفرعية من الاختبارات التي يتم تشغيلها ، يمكنك تشغيل npm run graph:shuffleGraphTestData <graph-exercise-number> ، والتي ستعمل على تعديل اختبارات تمرين الرسم البياني المحدد ، والتي ستؤدي بعد ذلك إلى مجموعة فرعية مختلفة من الاختبارات.
على سبيل المثال ، لإعداد اختبارات تمرين الرسم البياني رقم 2 ، تشغيل:
npm run graph:shuffleGraphTestData 2تعتبر تمارين الرسم البياني رائعة لفهم علاقات التبعية بين المهام ، ومع ذلك ، فهي لا تغطي الطيف الكامل للسيناريوهات المحتملة ، حيث يمكن أن يتم تمثيل تبعياتها فقط في وقت الترجمة ويمكن تمثيله بواسطة رسم بياني.
لذلك لدينا هذه الفئة من التدريبات الملموسة ، حيث يتم تقديمها مع سيناريوهات ملموسة يجب عليك تنفيذها.
نظرًا لأن كل تمرين في هذه الفئة فريد من نوعه ، فإن وصفها يتم توضيحه مع مجلدهم.
تم تصميم تمارين الأساس لمساعدتك على تعزيز فهمك لمؤسسات الوعود ، من خلال إعادة تنفيذ الوظائف المتعلقة بالوعد ، وفي النهاية الوعد نفسه.
الأوصاف يتم توصيلها بالتمارين.
يمكن العثور على حلول للتمارين في هذا الريبو ، على سبيل المثال https://github.com/henriqueinonhe/promises-training/blob/master/src/exercises/concrete/concurrencyabort/exercise.ts.
ومع ذلك ، نوصيك بالتحقق فقط من الحلول بعد حل التمرين بنفسك ، لأن الهدف هو أن تتعلم عن طريق حل التمارين.
أيضًا ، ضع في اعتبارك أن الحلول المقدمة في الوقت الحالي ليست بالضرورة أفضل الأحداث ، مما يعني أنه حتى لو كانت حلولك لا تشبه تلك التي ستجده هنا على الإطلاق ، فهذا لا يعني أنها سيئة.
لتخفيف الترقية إلى الإصدارات الأحدث ، أنشأنا برنامجًا ترحيلًا يقوم تلقائيًا بترحيل التثبيت إلى أحدث إصدار مع الحفاظ على حلولك.
لتشغيل البرنامج النصي للترحيل ، قم بتشغيل:
npm create promises-training@latest -- --migrateتم ترخيص هذا المشروع بموجب CC-By-NC-ND 4.0.
الهدف من هذا المشروع هو أن تكون مورد تعليمي مجاني وأن تظل حرة ويمكن الوصول إليها إلى الأبد.
فيما يلي سؤال وجواب لبعض الأسئلة الشائعة المتعلقة بالترخيص:
هل يمكنني استخدام هذا المشروع للدراسة الذاتية أو الجماعية؟
نعم ، من فضلك تفعل.
هل يمكنني استخدام هذا المشروع في تدريب شركة داخلية؟
نعم ، طالما أنك ترجو إلى المشروع وتوضح أن المشروع يمكن الوصول إليه بحرية بشكل مستقل عن التدريب.
هل يمكنني استخدام هذا المشروع لجلسات التوجيه/ورشة العمل المدفوعة؟
نعم ، طالما أنك ترجو إلى المشروع ، أوضح أن المشروع يمكن الوصول إليه بحرية بشكل مستقل عن التوجيه/ورشة العمل ، وتوضح أنك تتقاضى وقتًا في وقتك وليس للمشروع نفسه ، مما يوضح أن المشروع ليس جزءًا من موادك الخاصة ويوضحون أننا لا نؤيدك أو خدماتك.
هل يمكنني استخدام هذا المشروع للدورة المدفوعة عبر الإنترنت؟
نعم ، طالما أنك ترجو إلى المشروع ، أوضح أن المشروع يمكن الوصول إليه بحرية بشكل مستقل عن الدورة التدريبية عبر الإنترنت ، وتوضح أنك تتقدم لوقتك وليس للمشروع نفسه ، أوضح أن المشروع ليس جزءًا من موادك الخاصة ويوضحون أننا لا نؤيدك أو خدماتك.
هل يمكنني إنشاء شوكة لهذا المشروع واستخدامه لأغراض بلدي؟
لا ، لا يمكنك ذلك. يمكنك فقط استخدام هذا المشروع كما هو ، دون أي تعديلات. هذا ضروري لمنع الأشخاص من إنشاء شوكات ثم فرض رسوم عليهم.
هل يمكنني إنشاء دورة عبر الإنترنت بناءً على هذا المشروع؟
لا ، لا يمكنك ذلك ، لأننا لا نريد أن يقوم الأشخاص بإنشاء "أغلفة" حول هذا المشروع ومن ثم الشحن لهم.
إذا كانت لديك أي أسئلة بخصوص الترخيص ، أو ترغب في التحدث عن حالة استخدام محددة ، فلا تتردد في الوصول إلي على [email protected].