سؤال

ولقد قرأت بعض الأسئلة الأخرى ذات الصلة (<لأ href = "https://stackoverflow.com/questions/214491/pattern-for-wrapping-an-asynchronous-javascript-function-to-make-it -synchronous "> نمط للالتفاف وظيفة جافا سكريبت غير المتزامنة لجعله متزامن و جعل متزامن الحدث المتزامن في جافا سكريبت وقد يكون هناك أكثر)، ولكن أريد فقط أن تتأكد من أن يستنفد كل الاحتمالات.

قد يكون من الممكن "تحويل" ومدعوم غير متزامن إلى واحد شبه متزامن باستخدام setInterval أو setTimeout؟

وكانت الفكرة هي أنه عند نجاح طلب اياكس سيتم تعيين متغير، والتي سوف تكون إشارة لحلقة بينما (التي تسمى إما setInterval أو setTimeout، وظيفة رد المناسبة ع) للخروج. أو أنا في الأساس سوء فهم قدرات (أو قيود؟) من setInterval و / أو setTimeout؟

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

المحلول

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

وعلى سبيل المثال:

XHR.get(your_data, function()
   {
      //what you would have done "synchronously"
   });

وبينما يمكنك استخدام setInterval و / أو setTimeout (مع المكالمات إلى setTimeout مرة أخرى في الجسم وظيفة) إلى "استطلاع" لرمز النجاح، هذا النهج هو أدنى بشكل كبير لمجرد التعامل مع رد في المقام الأول بدلا من الاقتراع ل ذلك. انه يقدم الكمون، ويهرب مع وحدة المعالجة المركزية، وليس حجم طلبات XHR متعددة عبر، على سبيل المثال بعض أوجه القصور.

سوف

وXHR استدعاء الدالة عندما يكمل، أنه لا معنى لتشغيل وظيفة يسأل "هل فعلنا حتى الآن؟ هل فعلنا حتى الآن؟" في هذه الأثناء. من ناحية أخرى إذا كان هناك بعض السلوك الدوري كنت ترغب في حظر حتى يأتي استجابة الظهر (قطعة من الرسوم المتحركة التي تحتاج تلك البيانات لتشغيل، على سبيل المثال) أنه من المقبول تماما أن تحاصر رمز الحجب في حال البيان:

var tick = window.setTimeout(tock, 20);
var tock = function()
{
   if (response_done)
   {
      // dependent code
   }
   tick = window.setTimeout(tock, 20);
}
XHR.get(your_data, function() { /*Handle response*/ response_done = true; });

نصائح أخرى

إذا أنا الحصول على حق سؤالك، هل يمكن تحقيق تأثير مماثل باستخدام التعليمات البرمجية التالية:

var computationInterval =
    window.setInterval(function() {
        // do a computation cycle, as if you're in the body of a while loop
    }, 100);

$.get('http://example.com/areWeThereYet', function() {
    // break the intervals (the pseudo-cycle)
    window.clearInterval(computationInterval);
});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top