سؤال

يحرر:لقد اكتشفت إجابة سؤال YUI3 الأصلي الذي نشرته هنا، ولكنه أدى إلى سؤال آخر وبدلاً من بدء موضوع جديد اعتقدت أنني سأضيفه هنا فقط.يرجى التمرير لأسفل للوصول إلى السؤال الجديد (بالخط العريض).

السؤال الأصلي:أواجه بعض المشكلات في إنشاء مؤقت العد التنازلي لـ JavaScript داخل تعريف YUI، أعتقد أن الأمر يتعلق بنطاق الكائن.هذا هو الكود الخاص بي:

YUI({combine: true, timeout: 10000}).use("node", function (Y) {
    var timer = new function(){};
    Y.augment(timer, Y.EventTarget);
    timer.on('timer:down', function() {
        Y.log('timer down event fired', 'event');
        Y.Lang.later(1000, Y, timer_trigger());
    });
    timer.on('timer:end', function() {
        Y.log('timer end event fired', 'event');
    });

    var timer_from;

    function startTimer(seconds){ // start a coundown from seconds to 0
        timer_from = seconds;
        timer_trigger();
    }

    function timer_display(){
        var mins = Math.floor(timer_from/60);
        var secs = timer_from - mins*60;
        var secsDisp = secs;
        if(secs<10){
            secsDisp = '0' + secs;
        }
        Y.one('#timer').set('innerHTML', mins + ':' + secsDisp);
    }

    function timer_trigger(){
        Y.log('timer from is: '+timer_from);
        if(timer_from > 0){
            timer_from--;
            timer_display();
            if(timer_from > 0){
                timer.fire('timer:down');
            }
        } else {
            timer.fire('timer:end');
        }
    }

    function initializePage(){
        startTimer(900);
    }


});

الخطأ الذي أتلقاه هو أنه لا ينتظر 1000 مللي ثانية كما أطلب منه الاتصال timer_trigger() ويسألني Safari في النهاية عما إذا كنت أرغب في التوقف عن تشغيل الكود.عندما أقوم بذلك بعد ثوانٍ قليلة من تحميل الصفحة، يكون المؤقت قد انخفض بالفعل إلى حوالي 3 أو 4 دقائق.لقد حاولت أيضًا استخدام setTimeout ولكن هذا يؤدي أيضًا إلى نفس النتيجة.هل أستطيع مساعدتك؟وسأكون ممتنا حقا!

يحرر:لقد توصلت بالفعل إلى حل - جاء هذا بعد ساعات من تجربة الكثير من الأشياء، ولكن يمكن لعدد قليل من عمليات البحث على Google أن تؤدي في بعض الأحيان إلى نتائج/إجابات جديدة (لقد وجدت الإجابة على هذا الموقع, ، في الحقيقة).

يبدو أن الكود الخاص بي كان ينشئ حالة سباق، وكل ما كان علي فعله لإصلاحه هو ما يلي:

setTimeout(function(){ 
    timer_trigger();
}, 1000);

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

كيف يعمل الترابط في JavaScript وما سبب حالة السباق الخاصة بي، ولماذا أدى التغيير الطفيف في الكود إلى إصلاح الخطأ الذي حدث لي؟

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

المحلول

لاحظ ذلك أيضًا

Y.Lang.later(1000, Y, timer_trigger());

ينفذ timer_trigger على الفور ويمرر القيمة المرجعة إلى Y.Lang.later.ربما كنت تقصد

Y.Lang.later(1000, Y, timer_trigger);

نصائح أخرى

المشكلة ليست في حالة السباق.سبب الاستدعاء الإضافي لـ setTimeout "لإصلاح" الكود الخاص بك هو وجود خلل منطقي في timer_trigger.النظر في ما يحدث في حالة timer_from هو 1 عند استدعاء الدالة.لن يتم تشغيل أي من الموقت: لأسفل أو الموقت: النهاية.

function timer_trigger(){
    Y.log('timer from is: '+timer_from);
    if(timer_from > 0){      // Since timer_from is 1, the if block is entered
        timer_from--;        // timer_from is 0
        timer_display();
        if(timer_from > 0){  // This block is not entered, but it has no matching else
            timer.fire('timer:down');
        }
    } else {                 // The matching if block was entered, so this is not
        timer.fire('timer:end');
    }
}

لقد أضفت هذا الكود:

setTimeout(function(){ 
    timer_trigger();
}, 1000);

هذه تسبب timer_trigger ليتم استدعاؤهم مرة أخرى مع timer_from تم ضبطها بالفعل على 0، مما يسمح بتنفيذ كتلة else.

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