0

我只想用 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);
4

4 回答 4

5

使用标志:

(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);​
于 2012-08-02T19:45:09.147 回答
0

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

}());
于 2012-08-02T19:52:12.443 回答
0

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

function myFunc1(){

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


arguments.callee.done = true;    

}

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

于 2012-08-02T21:09:35.070 回答
-1

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

var i = 0;
var timeout_id = setTimeout(function(){
    console.log(i);
    if(i >= 5){ clearTimeout(timeout_id) }
    i++;
})
于 2012-08-02T19:47:17.777 回答