0

setIntervalを使用してmyfun1を1回だけ呼び出したい。グローバル変数の使用は避けたい。これを読んでも機能しません(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

これを回避する簡単な方法の 1 つは、関数自体で変数を使用することです。

function myFunc1(){

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


arguments.callee.done = true;    

}

このように、メソッド myFunc1 の "done" 変数は、メソッドが 1 回だけ実行されるようにします。

于 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 に答える