Триггеры setInterval функционируют несколько раз
РЕДАКТИРОВАТЬ: то, что я имею в виду под пожарами несколько раз, это то, что newjob() будет срабатывать 3 раза, каждые 5 секунд... так что через 20 секунд у меня будет срабатывать 12 раз, а не 4 раза, как хотелось бы. поэтому он срабатывает несколько раз каждые 5 секунд, а не один раз каждые 5 секунд.
У меня есть функция, которую я создал, используя Toastr для отображения сообщения в моем веб-приложении. В конце концов я собираюсь связать его с ajax-запросом к API, чтобы определить, отображать или нет сообщение, но сейчас я просто проверяю, как оно выглядит.
Я устанавливаю интервал, но он запускает функцию внутри него несколько раз (обычно 3).
$(document).ready(function() {
setInterval(function () {
newJob();
}, 5000);
});
я не могу сделать setInterval( function(e) { }, так как e не определено, так как с ним не связано ни одного события, по щелчку я использовал e.stopImmediatePropagation(); чтобы он срабатывал только один раз. как я могу остановить это немедленное распространение на заданном интервале, если у меня нет е?
благодарю вас.
РЕДАКТИРОВАТЬ: полный код:
var newJob = function(e) {
var i = -1;
var $toastlast;
var getMessage = function () {
var msgs = ["There's a new job in the job dispatch queue", "A job pending approval has timed out"];
i++;
if (i === msgs.length) {
i = 0;
}
return msgs[i];
};
var shortCutFunction = "success"; // 'success' or 'error'
toastr.options = {
closeButton: true,
progressBar: true,
debug: false,
positionClass: 'toast-top-full-width',
onclick: null,
timeOut: "0",
extendedTimeOut: "0",
showDuration: "0",
hideDuration: "0",
showEasing: "swing",
hideEasing: "linear",
showMethod: "fadeIn",
hideMethod: "fadeOut",
};
toastr.options.onclick = function () {
window.location.href = "/dispatcher";
};
var msg = getMessage();
$("#toastrOptions").text("Command: toastr["
+ shortCutFunction
+ "](\""
+ msg
+ "\")\n\ntoastr.options = "
+ JSON.stringify(toastr.options, null, 2)
);
var $toast = toastr[shortCutFunction](msg);
};
$(document).ready(function() {
setInterval(function () {
console.log('set interval');
newJob();
}, 5000);
});
и это мой файл index.phtml:
<?php
echo $this->headScript()->appendFile($this->basePath() . '/plugins/toastr/toastr.js')
echo $this->headScript()->appendFile($this->basePath().'/js/dispatchernotification.js');
?>
все, что я делаю, это добавляю javascript того, что я хочу запустить, в мой файл index.phtml и библиотеку toastr. с помощью console.loging внутри интервала я получаю три журнала.
вот скрипка.. не уверен, как запустить его, хотя он наготове http://jsfiddle.net/efecarranza/rfvbhr1o/
4 ответа
Не забудьте поставить свой setInterval
вне $(document).ready(function() {...})
, Так будет как:
<script>
$(document).ready(function() {
... some code ...
});
var myInterval;
clearInterval(myInterval);
myInterval = setInterval(function() {
... your code is here ...
}, 5000);
</script>
По какой-то причине, если это в пределах $(document).ready()
каждый раз, когда вы снова динамически переносите ту же страницу, setInterval
в прогрессии и clearInterval
Функция не помогает, пока вы не обновите браузер.
setInterval
будет продолжаться бесконечно. Я думаю, что вы ищете setTimeout
,
setInterval
: вызывать функцию повторно каждые x миллисекундsetTimeOut
: вызвать функцию через x миллисекунд.
У вас есть два варианта:
Очистите интервал, когда он больше не нужен:
var intervalId;
$(document).ready(function() {
intervalId = setInterval(function () {
newJob();
}, 5000);
});
// At some other point
clearInterval(intervalId);
Или, более простое решение в вашем случае, используйте setTimeout:
$(document).ready(function() {
setTimeout(function () {
newJob();
}, 5000);
});
Может быть, вы по ошибке дважды вызываете свой скрипт, как я! В приведенном ниже коде я дважды вызывал testLoop.js.
<script src="../js/testLoop.js"></script>
<script type="text/javascript" src="../js/testLoop.js"></script>
<script type="text/javascript" src="../js/cube.js"></script>
Было бы полезно, если бы вы могли добавить jsfiddle со своим кодом, чтобы мы могли точно видеть, что идет не так. Возможно, по какой-то причине функция setInterval вызывается несколько раз. Попробуйте добавить оператор console.log в начале этой функции, чтобы проверить, так ли это.
Если это так, и вы не можете понять, почему (и мы не можем, не зная вашего кода), вы можете поставить проверку в начале функции следующим образом:
if (typeof this.installInterval.done == "undefined") {
/*a bunch of code*/
this.installInterval.done = true
}