setInterval多次触发函数

时间:2015-05-27 15:53:42

标签: javascript jquery setinterval onready

编辑:我的意思是火灾多次,是newjob()将每5秒触发3次......所以在20秒内我会触发12次触发,而不是4次触发我想要的。因此它每5秒触发一次,而不是每5秒触发一次。

我有一个使用Toastr创建的功能,可以在我的Web应用程序上显示消息。我最终会将其与API的ajax请求联系起来,以确定是否显示消息,但现在我只是测试它的外观。

我正在设置一个间隔,但是它会多次激活它内部的函数(通常为3)。

$(document).ready(function() {
    setInterval(function () {
        newJob();
    }, 5000);
});

我无法执行setInterval(function(e){},因为e未定义,因为没有与之关联的事件,点击后,我已经使用e.stopImmediatePropagation();拥有它只开火一次。 如果我没有e?

,如何在设定的时间间隔内停止这种即时传播 谢谢。

编辑:完整代码:

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在interval内,我得到三个日志。

这里是一个小提琴。不知道如何运行它,因为它准备好了 http://jsfiddle.net/efecarranza/rfvbhr1o/

5 个答案:

答案 0 :(得分:2)

setInterval会无休止地继续下去。我想你正在寻找setTimeout

答案 1 :(得分:1)

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);
    });

答案 2 :(得分:0)

如果您可以添加一个jsfiddle代码,这将有所帮助,这样我们就可以确切地看到出了什么问题。无论出于何种原因,可能会多次调用setInterval函数。尝试在该函数的开头添加一个console.log语句来检查是否是这种情况。

如果是,你无法弄明白为什么(我们也不知道你的代码),你可以检查函数的开头,如下所示:

if (typeof this.installInterval.done == "undefined") {
  /*a bunch of code*/
  this.installInterval.done = true
}

答案 3 :(得分:0)

确保将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并且不会{39} ; t帮助,直到你真正刷新浏览器。

答案 4 :(得分:0)

可能是您误会了我两次调用脚本的错误! 在下面的代码中,我两次调用了“ testLoop.js”。

IO