jQuery: فاصل تأخير وظيفة Ajax حتى يتم الانتهاء من التشغيل السابق

StackOverflow https://stackoverflow.com/questions/509007

سؤال

لقد قمت بإعداد تحديث صفحة Ajax مع setInterval. من وقت لآخر ، يكون الخادم بطيئًا لدرجة أنه يتم بدء طلب جديد قبل الانتهاء من السابقين.

كيف يمكنني منع ذلك؟

هل كانت مفيدة؟

المحلول

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

 $.ajax({
   type: "POST",
   url: "some.php",
   data: "name=John&location=Boston",
   timeout: 5000, /* ms or 5s */
   success: function(msg){
     alert( "Data Saved: " + msg );
   }
 });

مستندات في jquery.com. مثال أعلاه من نفس المصدر ، ولكن مع قيمة المهلة المضافة.

نصائح أخرى

استخدم setTimeOut بدلاً من ذلك ، ابدأ setTimeOut آخر فقط بعد تلقي نتيجة طلب AJAX. وبهذه الطريقة يحدث التحديث فقط بعد الفترة المحددة منذ آخر تحديث.

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

يمكنك إضافة متغير يتتبع الوقت الذي تم فيه إرسال الطلب الحالي ، بحيث يمكنك حساب تأخير ديناميكي:

  1. خذ الوقت الحالي T1
  2. إرسال طلب غير متزامن
  3. أشياء أخرى تحدث ...
  4. عودة الطلب غير المتزامن ، ينفذ رد الاتصال
  5. طرح T1 من الوقت الحالي
  6. إذا كانت النتيجة <الفاصل الزمني لطلبك المطلوب ، فقم بتعيين قيمة التأخير> 0
  7. إذا كانت النتيجة> = فاصل طلبك المطلوب ، حدد قيمة التأخير = 0
  8. استدعاء setTimeOut مع قيمة التأخير ، وبدء الدورة التالية

ما يمكنني قوله هو ، استخدام العلم في الكود الخاص بك. مثل (ليس ما أوصي به بالفعل مجرد مثال بسيط)

var isWorking = false;
function doRequest(){
  if(isWorking) return;
  isWorking = true;
  $.ajax({
    ...,
    success: workWithResponse
  });
}

function workWithResponse(){
  /* doAnythingelse */
  isWorking = false;
}

setInterval(doRequest,1000);

شيء من هذا القبيل ، إنه بدائي ولكنك ستتجنب ظروف السباق. يعتبر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top