0Pricing
jQuery Academy · درس

معالجة مهام متعددة غير متزامنة

أتقن تنسيق عدة مهام غير متزامنة مستقلة أو مترابطة، مع ضمان ترتيب التنفيذ الصحيح ومعالجة الأخطاء في جميع العمليات.

معالجة مهام متعددة غير متزامنة درس مجاني في jQuery Academy على CoddyKit. هذا هو الدرس 3 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في jQuery Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة jQuery Academy 3 دروس في المجموع.

لماذا ننسّق المهام غير المتزامنة؟

في تطوير الويب، تكون العديد من العمليات غير متزامنة. وهذا يعني أنها لا تحدث فورًا أو وفق تسلسل صارم. ومن أمثلتها جلب البيانات من خادم، أو تحميل الصور، أو تشغيل الرسوم المتحركة.

عندما يحتاج تطبيقكم إلى تنفيذ عدة مهام من هذا النوع في الوقت نفسه أو بترتيب محدد، فإنكم تحتاجون إلى طريقة لتنسيقها بفاعلية. سيوضح لكم هذا الدرس كيفية القيام بذلك!

تحدي المهام المتعددة

تخيلوا أنكم بحاجة إلى تحميل الملف الشخصي لمستخدم وإشعاراته الأخيرة. كلاهما طلب منفصل إلى الخادم.

  • كيف تعرفون أن كليهما قد اكتمل؟
  • ماذا يحدث إذا فشل أحدهما؟
  • ماذا يحدث إذا كان أحدهما يعتمد على الآخر (مثل جلب إشعارات لمعرّف مستخدم محدد عُثر عليه في الملف الشخصي)؟

من دون تنسيق مناسب، قد تعرض واجهة المستخدم بيانات غير مكتملة أو تتعطل تمامًا.

التعرّف على `$.when()` للعمليات المتوازية

تُعد $.when() في jQuery أداة قوية لتنسيق العمليات غير المتزامنة المتعددة والمستقلة. وتتلقى كائنًا واحدًا أو أكثر من كائنات Deferred/Promise كوسائط.

تعيد $.when() Promise رئيسيًا يكتمل عند اكتمال كل الوعود الفردية المُمرَّرة إليها. وإذا رُفض أيٌّ منها، يُرفض Promise الرئيسي فورًا.

مثال على `$.when()`: الجلب المتوازي

لنحاكِ جلب مجموعتي بيانات مختلفتين بالتوازي. سنستخدم $.Deferred() لمحاكاة طلبات AJAX لأغراض التوضيح.

حاولوا تشغيل هذه الشيفرة:

// Assume jQuery is loaded in the environment
$(function() {
  function fetchData(name, delay) {
    let dfd = $.Deferred();
    setTimeout(function() {
      console.log(`Finished fetching ${name}`);
      dfd.resolve(`Data for ${name}`);
    }, delay);
    return dfd.promise();
  }

  let profilePromise = fetchData("User Profile", 1500);
  let settingsPromise = fetchData("App Settings", 800);

  console.log("Starting parallel fetches...");

  $.when(profilePromise, settingsPromise)
    .done(function(profileData, settingsData) {
      console.log("All data loaded successfully!");
      console.log(`Profile: ${profileData}`);
      console.log(`Settings: ${settingsData}`);
    });
});

معالجة نتائج `$.when()`

عند اكتمال Promise الخاص بـ $.when()، يتلقى استدعاء .done() القيم المكتملة من كل الوعود الأصلية كوسائط منفصلة.

  • إذا مررتم N من الوعود إلى $.when()، فسيتلقى استدعاء .done() عددًا قدره N من الوسائط.
  • تأتي الوسائط بالترتيب نفسه الذي مُرِّرت به الوعود إلى $.when().

يسهّل ذلك العمل مع جميع النتائج بعد جاهزيتها.

معالجة الأخطاء في `$.when()`

ماذا يحدث إذا فشلت إحدى العمليات المتوازية؟ يُرفض Promise الرئيسي الخاص بـ $.when() فورًا إذا رُفض أيٌّ من الوعود الفردية.

يُفعَّل عندئذٍ استدعاء .fail()، ويتلقى سبب الرفض من أول Promise فشل. وستستمر العمليات المتوازية المتبقية في الاكتمال، لكن $.when() سيكون قد أشار إلى الفشل مسبقًا.

مثال: `$.when()` مع حدوث فشل

لنعدّل المثال السابق بحيث يفشل أحد طلبات الجلب. لاحظوا الناتج:

// Assume jQuery is loaded in the environment
$(function() {
  function fetchData(name, delay, shouldSucceed = true) {
    let dfd = $.Deferred();
    setTimeout(function() {
      if (shouldSucceed) {
        console.log(`Finished fetching ${name}`);
        dfd.resolve(`Data for ${name}`);
      } else {
        console.log(`Failed to fetch ${name}`);
        dfd.reject(`Error: ${name} could not be loaded`);
      }
    }, delay);
    return dfd.promise();
  }

  let profilePromise = fetchData("User Profile", 1500, true);
  let settingsPromise = fetchData("App Settings", 800, false); // This one will fail

  console.log("Starting parallel fetches (one will fail)...");

  $.when(profilePromise, settingsPromise)
    .done(function(profileData, settingsData) {
      console.log("All data loaded successfully! (This won't run)");
    })
    .fail(function(errorReason) {
      console.log("One or more operations failed!");
      console.log(`Reason: ${errorReason}`);
    });
});

تنسيق المهام التابعة

أحيانًا لا تكون المهام مستقلة. قد تحتاجون إلى:

  • جلب معرّف مستخدم.
  • ثم استخدام ذلك المعرّف لجلب تفاصيل المستخدم.
  • ثم استخدام تلك التفاصيل لجلب منشوراته المحددة.

يتطلب ذلك سلسلة متتابعة من العمليات غير المتزامنة، حيث تعتمد كل خطوة على نجاح الخطوة السابقة ونتيجتها. نحقق ذلك بربط .then() أو .pipe().

مثال: ربط طلبات AJAX التابعة

إليكم كيفية ربط طلبي AJAX محاكَيين، حيث يعتمد الثاني على نتيجة الأول. لاحظوا كيف تصبح القيمة التي يعيدها .then() الأول مُدخلًا لـ .then() التالي.

// Assume jQuery is loaded in the environment
$(function() {
  function fetchUserId() {
    let dfd = $.Deferred();
    setTimeout(() => {
      console.log("User ID fetched: 123");
      dfd.resolve(123);
    }, 500);
    return dfd.promise();
  }

  function fetchUserDetails(userId) {
    let dfd = $.Deferred();
    setTimeout(() => {
      if (userId === 123) {
        console.log(`Details fetched for user ${userId}`);
        dfd.resolve(`Details for User ${userId}`);
      } else {
        dfd.reject("Invalid User ID");
      }
    }, 700);
    return dfd.promise();
  }

  console.log("Starting dependent fetch chain...");

  fetchUserId()
    .then(function(id) {
      return fetchUserDetails(id); // Return a new promise
    })
    .done(function(details) {
      console.log("Full chain successful!");
      console.log(`Final Result: ${details}`);
    })
    .fail(function(error) {
      console.log("Chain failed:", error);
    });
});

اختبروا معلوماتكم

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

ما أسلوب jQuery الأنسب لهذا التنسيق المحدد؟

مراجعة: إتقان تنسيق العمليات غير المتزامنة

لقد تعلمتم كيفية التعامل بفاعلية مع عدة مهام غير متزامنة!

  • $.when(): مثالي لتشغيل المهام المستقلة بالتوازي والانتظار حتى تكتمل جميعها أو يفشل أيٌّ منها.
  • الربط باستخدام .then(): مثالي للمهام التابعة التي تحتاج فيها العملية التالية إلى ناتج العملية السابقة.
  • معالجة الأخطاء: يوفر كل من $.when() والوعود المرتبطة .fail() لالتقاط حالات الرفض في أي نقطة، مما يجعل تطبيقاتكم أكثر متانة.

تُعد هذه الأنماط أساسية لبناء تطبيقات ويب ديناميكية وسريعة الاستجابة باستخدام jQuery.

الأسئلة الشائعة

هل درس «معالجة مهام متعددة غير متزامنة» مجاني؟

نعم — نص درس «معالجة مهام متعددة غير متزامنة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة jQuery Academy، انتقل إلى CoddyKit PRO. تتضمن دورة jQuery Academy 3 دروس في المجموع.

ماذا ستتعلم في «معالجة مهام متعددة غير متزامنة»؟

أتقن تنسيق عدة مهام غير متزامنة مستقلة أو مترابطة، مع ضمان ترتيب التنفيذ الصحيح ومعالجة الأخطاء في جميع العمليات. تتمرن على jQuery Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ jQuery Academy؟

لا تُشترط خبرة سابقة. jQuery Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 3.

كم من الوقت يستغرق درس «معالجة مهام متعددة غير متزامنة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس jQuery Academy هذا؟

نعم. كل درس في jQuery Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. فهم الكائنات المؤجّلة
  2. تسلسل الوعود وتركيبها
  3. معالجة مهام متعددة غير متزامنة
← العودة إلى jQuery Academy