我只是在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');
});
答案 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 Verify和How 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');
}