在setTimeout之后返回变量

时间:2013-11-14 19:20:50

标签: javascript asynchronous settimeout

我只是在setTimeout回调中设置后才尝试返回变量。我想不出有任何其他方法可以做到这一点,但这是我的尝试(我知道代码似乎很愚蠢,但它是解决Cordova错误)。出于我理解的原因,它会导致无限循环。

function isConnected() {
    var done = false;
    setTimeout(function() {
        done = true;
    }, 500);

    while (!done) {}
    return navigator.connection.type!== Connection.NONE;
}

任何人都可以向我解释为什么会发生这种情况,或提供替代方案吗?

更新(解决方案):

function isConnected(callback) {
    setTimeout(function() {     
        callback(navigator.connection.type !== Connection.NONE);
    }, 500);
}


isConnected(function(connected) {
    if (!connected)
        alert('Not Connected');
});

3 个答案:

答案 0 :(得分:6)

你根本无法解决问题。因为javascript是单线程的,所以setTimeout回调只能在你的JS执行线程完成所以你的无限循环运行时才会运行,它永远不会运行而你的代码会挂起。最终,浏览器会抱怨一个长期运行的JS并提供关闭它。

相反,您需要在setTimeout()上使用回调函数,并从该回调继续您的代码。您不能使用顺序代码进行超时。您必须使用异步编码样式。

你可以做一些这样的事情,你传入一个回调函数,然后调用回调并传递连接的布尔值:

function GetConnectedState(callback) {

    setTimeout(function() {     
        callback(navigator.connection.type !== Connection.NONE);
    }, 500);

}

除了在1/2秒内查看连接状态外,您现有的代码似乎没有提供任何其他代码。使用javascript中的任何实际异步操作(例如ajax调用或websocket连接),还应该有成功或完成回调,它将告诉您何时/是否操作实际完成,您还可以触发基于的回调那(大部分时间早于1/2秒)。所以,这看起来并不像一个完整的解决方案,但是你只是告诉我们你正在使用它。

例如,您可以看到这样一个答案:当图像成功加载时会调用回调,出现错误或超时而无响应:Javascript Image Url VerifyHow to implement a "function timeout" in Javascript - not just the 'setTimeout'。类似的概念可用于在其他类型的异步调用上实现自己的超时。

答案 1 :(得分:4)

Javascript是单线程的。在脚本返回主事件循环之前,超时函数无法运行。但只要您处于while循环中它就永远不会返回,因此超时函数永远不会运行,因此done永远不会设置为true

在Javascript中无法在返回之前等待异步事件。

答案 2 :(得分:1)

5年后的我重新审视时,不禁提出了一个更奇特的选择:

await new Promise(function(resolve) {
  setTimeout(resolve, 500);
});
if (navigator.connection.type === Connection.NONE) {
  alert('Not Connected');
}