我试图仅在 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()
上使用回调函数并从该回调继续您的代码。您不能将顺序代码用于超时。您必须使用异步编码风格。
你可以做这样的事情,你传入一个回调,它调用回调并将它传递给连接的 bool 值:
function GetConnectedState(callback) {
setTimeout(function() {
callback(navigator.connection.type !== Connection.NONE);
}, 500);
}
除了在 1/2 秒内查看连接状态外,您现有的代码似乎没有提供任何其他功能。对于 javascript 中的任何真正类型的异步操作(例如 ajax 调用或 websocket 连接),还应该有一个成功或完成回调,它会告诉您操作何时/是否实际完成,您还可以根据以下条件触发回调那(大多数时候快于 1/2 秒)。所以,这看起来并不是一个完整的解决方案,但这就是您向我们展示的您正在使用的全部内容。
例如,您可以查看以下答案,它会在图像加载成功、出现错误或超时且无响应时调用回调:Javascript Image Url Verify和 How to implement a "function timeout" in Javascript - not just the 'setTimeout' .类似的概念可用于在某些其他类型的异步调用上实现您自己的超时。
关于javascript - setTimeout 后返回变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19986444/