Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待函数完成,然后返回一个值_Javascript_Http_Xmlhttprequest - Fatal编程技术网

Javascript 等待函数完成,然后返回一个值

Javascript 等待函数完成,然后返回一个值,javascript,http,xmlhttprequest,Javascript,Http,Xmlhttprequest,我让这个函数离线。check(),执行时间为1秒..所以下面的函数没有等待它,并且在第一次执行时总是返回false。我使用了设置超时..但它总是返回null function checkstats() { Offline.check(); // This returns Offline.state=up or down and it takes 1 seconds to complete. if(Offline.state=="up") { r

我让这个函数
离线。check(),执行时间为1秒..所以下面的函数没有等待它,并且在第一次执行时总是返回false。我使用了设置超时..但它总是返回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();

您可以使用异步JavaScript来解决这个问题。在JavaScript中有几种实现异步行为的方法。您可以使用回调、侦听器或承诺

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


理想情况下,您可以在
脱机时设置回调函数。请检查
,但我知道它是外部的,因此不起作用

您可以使用超时等待
脱机。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
});
如果您不确定脱机.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
});

脱机.check()函数的作用是什么?那里有异步操作吗?最有可能的情况是,您必须为异步操作传递回调,并在callback.yea中实现其余代码。Offline.check()是外部js。。因此,我无法将回调添加到该异步。有其他方法解决此问题吗?也许可以调用offline.check(在html页面或加载的js文件上),将其余代码动态附加到脚本标记中。。
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
});