在设置超时后返回变量

Return variable after setTimeout

本文关键字:返回 变量 超时 设置      更新时间:2023-09-26

我尝试仅在 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');
});

你根本无法以这种方式解决问题。 因为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 图像 URL 验证和如何在 Javascript 中实现"函数超时" - 而不仅仅是"setTimeout"。 类似的概念可用于在某些其他类型的异步调用上实现自己的超时。

当我在 5 年后重新审视这个问题时,忍不住提出了一个更花哨的选择:

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

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

在 Javascript 中,在返回之前不可能等待异步事件。