جافا سكريبت هي لغة برمجة ذات ترابط واحد، مما يعني أنها يمكنها تشغيل مهمة واحدة فقط في كل مرة. يصبح هذا أمرًا صعبًا مع العمليات غير المتزامنة مثل جلب البيانات أو ضبط المؤقتات، والتي يمكن أن تمنع تدفق التنفيذ وتبطئ تطبيقك.
للتعامل مع هذه المهام غير المتزامنة دون تجميد سلسلة المحادثات، نواجه Promise - أداة قوية تعمل على تبسيط البرمجة غير المتزامنة. باستخدام الوعود، يمكنك إدارة المهام طويلة الأمد بشكل أكثر فعالية، وكتابة تعليمات برمجية أكثر وضوحًا وأكثر قابلية للقراءة، وتجنب "جحيم رد الاتصال."
في هذه المقالة، أهدف إلى تعريفك بماهية الوعود، وكيفية عملها، وكيفية تبسيط البرمجة غير المتزامنة.
تخيل أنك تطلب وجبة في أحد المطاعم. بمجرد تقديم طلبك، لا تنتظر بالقرب من المطبخ حتى يتم إعداد طعامك. بدلاً من ذلك، يمكنك إجراء المحادثة أو الاستمتاع بالأجواء بينما يقوم المطبخ بإعداد وجبتك في الخلفية. يعدك المطعم بتقديم الطعام لك بمجرد أن يصبح جاهزًا. يمكنك الوثوق بهذا الوعد لأنه في النهاية سيحدث أحد أمرين: إما أن تصل وجبتك (تم استيفاءها)، أو سيبلغك المطبخ بعدم قدرتهم على إكمال الطلب (مرفوض ).
في جافا سكريبت، تعملالوعود بطريقة مماثلة. عندما تطلب من JavaScript القيام بشيء يستغرق وقتًا - مثل جلب البيانات من الخادم - فإنها تُرجع وعد. هذا الوعد لا يمنحك النتيجة على الفور. بدلاً من ذلك، يخبرك، " سأعود إليك عند انتهاء العمل. " خلال ذلك الوقت، يستمر تشغيل بقية التعليمات البرمجية الخاصة بك. بمجرد اكتمال المهمة، يكون الوعد إما:
الوعد قيمة قد تكون متاحة الآن أو في المستقبل أو أبدًا. ولها ثلاث حالات:
Promise، يمكنك استخدام مُنشئ Promise، والذي يأخذ وظيفة (تُعرف باسم المنفذ) لها معلمتين: الحل والرفض. يتم استدعاء وظيفة الحل عند تحقيق الوعد، بينما يتم استدعاء وظيفة الرفض عند الرفض.
const myPromise = new Promise((resolve, reject) => { // Simulating an asynchronous task (e.g., fetching data) const success = true; // Simulate success or failure if (success) { resolve("Operation completed successfully!"); // Fulfill the promise } else { reject("Operation failed."); // Reject the promise } });2. حل الوعود ورفضها
الوعد، يمكنك تحديد نتائجه عن طريق استدعاء القرار أو الرفض:
وعد، فإن الخطوة التالية هي استهلاكه. توفر جافا سكريبت عدة طرق للتعامل مع نتائج الوعود: .then() و .catch() و .finally(). تخدم كل طريقة من هذه الطرق غرضًا محددًا وتسمح لك بإدارة نتائج العمليات غير المتزامنة بشكل فعال.
const myPromise = new Promise((resolve, reject) => { // Simulating an asynchronous task (e.g., fetching data) const success = true; // Simulate success or failure if (success) { resolve("Operation completed successfully!"); // Fulfill the promise } else { reject("Operation failed."); // Reject the promise } });
const myPromise = new Promise((resolve, reject) => { // Simulating an asynchronous task (e.g., fetching data) const success = true; // Simulate success or failure if (success) { resolve("Operation completed successfully!"); // Fulfill the promise } else { reject("Operation failed."); // Reject the promise } });
const myPromise = new Promise((resolve, reject) => { // Simulating an asynchronous task (e.g., fetching data) const success = true; // Simulate success or failure if (success) { resolve("Operation completed successfully!"); // Fulfill the promise } else { reject("Operation failed."); // Reject the promise } });للإيجاز:
دعونا نلقي نظرة على المثال التالي:
const myPromise = new Promise((resolve, reject) => { // Simulating an asynchronous task (e.g., fetching data) const success = true; // Simulate success or failure if (success) { resolve("Operation completed successfully!"); // Fulfill the promise } else { reject("Operation failed."); // Reject the promise } });في هذا المثال، تقوم الدالة fetchUserData بإرجاع
وعد الذي يتم حله باستخدام معلومات المستخدم. يتم بعد ذلك تمرير القيمة التي تم حلها إلى الدالة fetchPosts، والتي تقوم بإرجاع وعد آخر. إذا تم رفض أي من هذه الوعود، فسيتم اكتشاف الخطأ في طريقة .catch() النهائية، مما يسمح بمعالجة الأخطاء بشكل فعال عبر السلسلة.
خاتمة
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3