Javascript只使用setInterval()调用一个子函数一次

Javascript call only once a child function with setInterval()

本文关键字:一个 一次 子函数 调用 setInterval Javascript      更新时间:2023-09-26

我只想用setInterval调用myfun1一次。我想避免使用全局变量。读这个,但它不起作用(只是每2000毫秒调用一次函数)。自然,我需要每2000毫秒调用一次main()。

(function($){         
    setinterval(main,2000);  
     function main (){            
        if(/*condition*/) return;
        function callItOnce(fn) {
            var called = false;
            return function() {
                if (!called) {
                    called = true;
                    return fn();
                }
                return;
            }
        }
        myfun1 = callITOnce(myfun1);
        myfun1();
        function myfun1(){/*code*/};
        function myfun2(){/*code*/};
        function myfun3(){/*code*/};
})(jquery);

使用标志:

(function($){ 
    var timer = setInterval(main,2000), ran=true;
    function main() {
        if(/*condition*/) return;
        if (ran) { //runs when ran=true, which is only the first time
            myfun1();
            ran = false;  //since it's set to false here
        }
        function myfun1(){/*code*/};
        function myfun2(){/*code*/};
        function myfun3(){/*code*/};
})(jquery);​

您编写的callItOnce函数应该可以工作。您只需要在setInterval调用之外声明该函数。否则,它每次都会被重新定义。

(function () {
function myfun1(){/*code*/};
function myfun2(){/*code*/};
function myfun3(){/*code*/};
function callItOnce(fn) {
    var called = false;
    return function() {
        if (!called) {
            called = true;
            return fn();
        }
        return;
    }
}
myfun1 = callItOnce(myfun1);
function main() {
    if(/*condition*/) return;
    myfun1();
}
setInterval(main, 2000);
}());

解决这一问题的一个简单方法是在函数本身上使用变量。

function myFunc1(){
if(arguments.callee.done){return;}

arguments.callee.done = true;    
}

这样,方法myFunc1上的"done"变量将确保该方法只执行一次。

setInterval返回一个值,您可以将该值传递给clearInterval以停止调用回调。

var i = 0;
var timeout_id = setTimeout(function(){
    console.log(i);
    if(i >= 5){ clearTimeout(timeout_id) }
    i++;
})