javascript - setTimeout 后返回变量

标签 javascript asynchronous 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() 上使用回调函数并从该回调继续您的代码。您不能将顺序代码用于超时。您必须使用异步编码风格。

你可以做这样的事情,你传入一个回调,它调用回调并将它传递给连接的 bool 值:

function GetConnectedState(callback) {

    setTimeout(function() {     
        callback(navigator.connection.type !== Connection.NONE);
    }, 500);

}

除了在 1/2 秒内查看连接状态外,您现有的代码似乎没有提供任何其他功能。对于 javascript 中的任何真正类型的异步操作(例如 ajax 调用或 websocket 连接),还应该有一个成功或完成回调,它会告诉您操作何时/是否实际完成,您还可以根据以下条件触发回调那(大多数时候快于 1/2 秒)。所以,这看起来并不是一个完整的解决方案,但这就是您向我们展示的您正在使用的全部内容。

例如,您可以查看以下答案,它会在图像加载成功、出现错误或超时且无响应时调用回调:Javascript Image Url VerifyHow to implement a "function timeout" in Javascript - not just the 'setTimeout' .类似的概念可用于在某些其他类型的异步调用上实现您自己的超时。

关于javascript - setTimeout 后返回变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19986444/

相关文章:

jquery - JS/jQ 处理大量 setTimeouts 的更有效方法

javascript - VueJS 阻止非事件浏览器选项卡上的事件

javascript - 在 QUnit 中使用 Mockjax?

Javascript 代码在 Rails 中无法正常工作

javascript - 在 Chrome 中使用 native 实现处理并行 promise

javascript - 如何强制 setTimeout 排队的任务执行顺序为 0 延迟

javascript - 从 GitHub 读取代码作为网页中的文本(原始)

javascript - 我想计算每个文本字段中的特定百分比并计算总成绩

javascript - 如何使用 jQuery 异步上传文件?

c# - Async/Await 或 Task.Run 在控制台应用程序/Windows 服务中