Триггеры 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
}
Другие вопросы по тегам