在设置超时后返回变量
Return variable after setTimeout
我尝试仅在 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 中,在返回之前不可能等待异步事件。
- 如何从jquery函数返回变量
- 返回变量作为构造函数
- 从导出的模块返回变量,并在另一个文件(NodeJS)中使用它
- 在JavaScript和knockout.js中,为什么可以'我不返回一个变量吗?为什么我必须返回变量,就好像它
- 如何从匿名函数返回变量
- 在呈现函数中返回变量
- 在设置超时后返回变量
- AngularJS在大括号中返回变量名称,而不是值
- JQuery:创建扩展返回变量未定义
- 我应该从量角器中元素的 getText() 承诺中分配一个变量或返回变量
- AJAX 在 cicle 完成后返回变量
- 如何返回变量并同时重置/删除它
- 如何从 javascript 中的回调函数返回变量
- 返回变量而不声明它的函数
- 正在从数组中返回变量名
- 从reader.onload事件返回变量
- 延迟返回变量,直到数据从Firebase同步
- 函数不't返回变量
- 如何将函数中的返回变量插入HTML表单
- Javascript 方法不返回变量