【问题标题】:Wait for Function to complete and then return a value等待 Function 完成,然后返回一个值
【发布时间】:2014-06-16 18:07:15
【问题描述】:

我有这个函数Offline.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();

【问题讨论】:

  • 你的 Offline.check() 函数是做什么的?那里有异步操作吗?很可能您必须为异步操作传递回调并在回调中实现其余代码。
  • 是的,其中正在进行异步操作。
  • Offline.check() 是外部 js .. 所以我不能向那个异步添加回调.. 还有其他方法来解决这个问题吗?
  • 可能调用offline.check(在您的html页面或加载的js文件上),将其余代码动态附加到脚本标记中..

标签: javascript http xmlhttprequest


【解决方案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
});

【讨论】:

    【解决方案2】:

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

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

    doOfflineCheck(function(){
        if(Offline.state=="up")
        {
        return true;
        }
        else
        {
        return false;
        }
    });
    
    function doOfflineCheck(cb){
        setTimeout(function(){
        Offline.check();
        },1000);
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-14
      • 2019-08-01
      • 1970-01-01
      • 2016-09-15
      • 2021-11-13
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      相关资源
      最近更新 更多