在setTimeout之后返回变量

Dra*_*vuk 3 javascript asynchronous settimeout

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

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

    while (!done) {}
    return navigator.connection.type!== Connection.NONE;
}
Run Code Online (Sandbox Code Playgroud)

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

更新(解决方案):

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


isConnected(function(connected) {
    if (!connected)
        alert('Not Connected');
});
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 6

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

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

您可以执行类似这样的操作,在其中传入回调并调用回调并将连接的布尔值传递给它:

function GetConnectedState(callback) {

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

}
Run Code Online (Sandbox Code Playgroud)

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

例如,这里是一个你可以看到的答案,当图像成功加载时会调用回调,出现错误或超时没有响应:Javascript Image Url验证以及如何在Javascript中实现"函数超时" - 而不仅仅是' setTimeout'.类似的概念可用于在某些其他类型的异步调用上实现您自己的超时.


Dra*_*vuk 5

当我在 5 年后重新审视这个时,不禁提供了一个更好的选择:

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