Javascript循环 - 等待价值

时间:2012-05-24 14:57:55

标签: javascript

在所有代码运行之前完成一个功能完成的噩梦。我试图建立一个计数器,只在代码完成时返回。

我已经仿效了这一点(我知道这不太棒,但如果有人能指出我的话,我会非常感激):

//I want this to alert "Done"
alert(timerCheck());

function timerCheck() {
    var finished;
    var myLoop = 5;
    for (i = 0; i < myLoop; i++) {
        //This is emulating the slow code
        window.setTimeout(checkFinished, 900);
        alert(i);
    }
    function checkFinished() {
        //I originally had the "return here, before realising my error
        finished = true;
    }
    if (finished) {
        //This is where my problem is 
        return "done";
    }
}

就像我说的,一个简单的例子 - 如果有人能够指出错误的话,它会给我带来很多麻烦!

3 个答案:

答案 0 :(得分:4)

如果该函数调用并依赖于异步函数,则无法同步获取函数的返回值。

你必须使用回调。有关更多详细信息,请参阅this question

例如,您的函数将如下所示:

// pass a callback which gets the result of function
timerCheck(function(result) {
    alert(result);
});

function timerCheck(callback) {
    var myLoop = 5,
        j = 0;

    for (var i = 0; i < myLoop; i++) {
        // This is emulating the slow code
        // this will invoke `checkFinished` immediately, 
        // after 900ms, after 1800ms, after 2700ms and after 3600ms
        window.setTimeout(checkFinished, i * 900);
    }

    function checkFinished() {
       j++;
       // after checkFinish was called 5 times, we invoke the callback
       if(j === 5) {
           callback('done');
       }
    }
}

答案 1 :(得分:0)

正如FelixKling评论的那样,如果该函数调用并依赖于异步函数,则无法同步获取函数的返回值。这类工作的一个解决方案可能是:

var finished = false;

function mySlowCode() {
    setTimeout(function() {
        finished = true;
    }, 1000);
}

function timerCheck() {
    // legend...
    (function waitForIt() {
        setTimeout(function() {
            if (!finished) {
                waitForIt();
            } else {
                // dary!
                letsDoIt();
            }
        }, 10);
    })();
}

function letsDoIt() {
    alert("done");
}

mySlowCode();
timerCheck();

函数timerCheck()将在函数letsDoIt()完成后调用函数mySlowCode()

答案 2 :(得分:-3)

你是否在功能名称之后没有任何parens尝试过它?

alert(timerCheck);