setInterval работает только один раз, затем останавливается

0

Я создаю функцию обратного отсчета, но она работает только в начале и затем останавливается.

var rek_inter = setInterval(cnt(s_, d), 1000);    

function cnt(deg, deg2) {
    deg--;
    while (deg < 0) {
        deg = 59;
        deg2--;
    }
    if (deg2 < 0) {
        $('#s_').html("ok");
    } else if (deg2 >= 0) {
        var d_sn = fixd(deg2);
        var s_sn = fixd(deg);
        $('#s_').html(d_sn + ":" + s_sn);
    }
}

function fixd(g) {
    if (g < 10) {
        return '0' + g;
    }
    return g;
}

Я тоже это пробовал;

var rek_inter = setInterval(function() {cnt(s_, d);}, 1000);

Но результат был таким же.

Если я поместил функцию в такую функцию интервалов:

    var rek_inter = setInterval(function () {

        s_--;
        while (s_ < 0) {
            s_ = 59;
            d--;
        }
        if (d < 0) {
            $('#s_').html("ok");
        } else if (d >= 0) {
            var d_sn = fixd(d);
            var s_sn = fixd(s_);
            $('#s_').html(d_sn + ":" + s_sn);
        }
    }, 1000);

    function fixd(g) {
        if (g < 10) {
            return '0' + g;
        }
        return g;
    }

Оно работает. Но мне это нужно, поскольку я написал сначала наверху. Что может быть проблемой и решением здесь?

  • 0
    jsbeautifier.org
  • 0
    можешь поделиться своим html? или поставить это на скрипку?
Показать ещё 4 комментария
Теги:

2 ответа

2
Лучший ответ

"У меня много значений s_, s_2, s_3.... и d, d1, d2... и я хочу использовать их в одном setInterval, поэтому я пытаюсь использовать cnt (s_, d), если я буду писать cnt (s_2, d2), cnt (s_3, d3).. "

Вы могли бы просто использовать закрытие в ваших интересах.

var rek_inter1 = setInterval(cnt(s_2, d2), 1000),
    rek_inter2 = setInterval(cnt(s_3, d3), 1000);

function cnt(deg, deg2) {
    return function () {
        deg--;
        while (deg < 0) {
            deg = 59;
            deg2--;
        }
        if (deg2 < 0) {
            $('#s_').html("ok");
        } else if (deg2 >= 0) {
            var d_sn = fixd(deg2);
            var s_sn = fixd(deg);
            $('#s_').html(d_sn + ":" + s_sn);
        }
    };
}
  • 0
    да, это работает;)
2

Первая попытка такая же, как:

setInterval ( value, time) ;

Здесь value = cnt(s_, d), результат вызова функции cnt.
Это не может работать, поскольку setInterval ожидает функцию. Жаль, что он не работает в javascript.

Во второй попытке проблема заключается в том, что вы изменяете только функцию var, поэтому никаких изменений не происходит: вы меняете deg, deg2, когда на самом деле вы хотели бы изменить s_ и d.

Третья попытка правильная, поскольку вы оба вызываете функцию и изменяете глобальные значения s_ и d. Я бы предпочел написать его так:

var rek_inter = setInterval( iterate , 1000);

function iterate () {
    s_--;
    while (s_ < 0) {
        s_ = 59;
        d--;
    }
    if (d < 0) {
        $('#s_').html("ok");
    } else if (d >= 0) {
        var d_sn = fixd(d);
        var s_sn = fixd(s_);
        $('#s_').html(d_sn + ":" + s_sn);
    }
}

Редактировать: ОП упоминает, что он хочет обрабатывать набор параметров (s_, d).
Я предлагаю вам создать массив объектов, который содержит такие параметры:

 var sdParameters = [];
 sdParameters.push( { s : some value , d: some other value} );
 sdParameters.push( { s : some value 2, d: some other value 2 } );
 ... // (or using a for loop to grab the ds and ss if possible) 

Затем каждый объект s/d определяется его индексом, поэтому с помощью:

function iterate (ind) {
    var s_ = --sdParameters[ind].s ;       
    while (s_ < 0) {
        s_ = 59;
        sdParameters[ind].d--;
    }
    var d = sdParameters[ind].d;
    if (d < 0) {
        $('#s_').html("ok");
    } else if (d >= 0) {
        var d_sn = fixd(d);
        var s_sn = fixd(s_);
        $('#s_').html(d_sn + ":" + s_sn);
    }
}

вы можете использовать все свои интервалы в одном глобальном массиве с помощью:

     var rek_inter = setInterval( iterate.bind(null,0) , 1000);
     var rek_inter1 = setInterval( iterate.bind(null,1) , 1000);

(очевидно, вы можете/должны хранить интервалы в массиве, вы можете хранить их в sdParameters.

Последнее замечание: я не мог использовать соответствующие имена переменных, так как я не мог угадать использование. Использование значимых имен в вашем коде может оказать большую помощь, когда ситуация усложнится.

  • 1
    Глобалы злые;)
  • 0
    У меня есть много значений s_, s_2, s_3 .... и d, d1, d2 ..., и я хочу использовать их в одном setInterval, поэтому я пытаюсь использовать cnt (s_, d); если это сработает, я напишу cnt (s_2, d2), cnt (s_3, d3) ..

Ещё вопросы

Сообщество Overcoder
Наверх
Меню