等待Function完成,然后返回一个值

时间:2014-06-15 09:34:50

标签: javascript http xmlhttprequest

我有这个函数Offline.check();,需要1秒才能执行。所以下面的函数没有等待它,它总是在第一次返回false。我使用了set time out ..但那总是返回null

  function checkstats()

    {

    Offline.check(); // This returns Offline.state=up  or down and it takes 1 seconds to complete.

    if(Offline.state=="up")
    {
    return true;
    }

    else
    {
    return false;
    }

    }

var a = checkstats();

2 个答案:

答案 0 :(得分:1)

理想情况下,您可以使用Offline.check设置回调函数,但我知道它是外部函数,因此无法正常工作。

您可以使用超时等待Offline.state设置,但是您也需要异步执行涉及变量a的任何操作:

function checkstats(callBack){  // checkstats() now takes a callback
    Offline.check();  // Start Offline.check() as usual

    setTimeout(function(){  // Set a timeout for 1 second
        if(Offline.state=="up")  // After 1 second, check Offline.state as usual
        {
            callBack(true);  // ...but we call the callback instead of returning
        }
        else
        {
            callBack(false);  // ...but we call the callback instead of returning
        }
    }, 1000);
}

checkstats(function(a){ // This anonymous function is the callback we're using
    // Now you can use "a" normally
});

如果您不确定Offline.check()正好用1秒,您可以使用间隔而不是超时,并尝试每秒,例如5秒:

function checkstats(callBack){
    Offline.check();

    var attempt = 0, maxAttempts = 5;
    var checkStatsInterval = setInterval(function(){
        if(++attempt > maxAttempts){
            // Ran out of attempts, just give up
            clearInterval(checkStatsInterval);
            alert('Waited '+maxAttempts+' seconds for Offline data. Giving up!');
            return;
        }
        if(Offline.state){
            clearInterval(checkStatsInterval);

            // It's loaded! Now confidently check Offline.state
            if(Offline.state=="up")
            {
                callBack(true);
            }
            else
            {
                callBack(false);
            }
        }
    }, 1000);
}

checkstats(function(a){
    // Now you can use "a" normally
});

答案 1 :(得分:0)

您可以使用异步JavaScript来解决此问题。有几种方法可以在JavaScript中实现异步行为。您可以使用Callbacks,Listeners或Promises。

无论如何,如果您确定它只需要1秒钟,则在回调函数中设置setTimeout并允许Offline.check()完成。 (如果它是外部的或懒惰的那里实现异步)

doOfflineCheck(function(){
    if(Offline.state=="up")
    {
    return true;
    }
    else
    {
    return false;
    }
});

function doOfflineCheck(cb){
    setTimeout(function(){
    Offline.check();
    },1000);
}