Я создаю функцию обратного отсчета, но она работает только в начале и затем останавливается.
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;
}
Оно работает. Но мне это нужно, поскольку я написал сначала наверху. Что может быть проблемой и решением здесь?
"У меня много значений 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);
}
};
}
Первая попытка такая же, как:
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.
Последнее замечание: я не мог использовать соответствующие имена переменных, так как я не мог угадать использование. Использование значимых имен в вашем коде может оказать большую помощь, когда ситуация усложнится.