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)
你根本无法解决问题.因为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'.类似的概念可用于在某些其他类型的异步调用上实现您自己的超时.
当我在 5 年后重新审视这个时,不禁提供了一个更好的选择:
await new Promise(function(resolve) {
setTimeout(resolve, 500);
});
if (navigator.connection.type === Connection.NONE) {
alert('Not Connected');
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3075 次 |
| 最近记录: |