同步异步操作时是否可以使for
和循环不挂起浏览器?while
我问这个是因为同步XMLHttpRequest
只会阻止 UI 事件,但不会完全挂起浏览器。我想有相同的循环行为。
同步异步操作时是否可以使for
和循环不挂起浏览器?while
我问这个是因为同步XMLHttpRequest
只会阻止 UI 事件,但不会完全挂起浏览器。我想有相同的循环行为。
我认为你可能会解决这个问题有点错误。JavaScript 是单线程的,因此您不希望在等待条件时出现“阻塞”。相反,您想利用回调来提醒函数您已经完成了您正在做的任何事情。
例如,假设您有以下常见场景:您的页面有一个“提交”按钮,用于验证数据,然后询问用户是否确定要继续,然后提交数据。您可能会想象代码如下所示:
function clickSubmit() {
//validate data
//show confirmation dialog
//block until "OK" or "Cancel" is clicked
//if OK, submit
//else cancel
}
当然,这不会真正起作用,因为当您的功能被阻止时,用户将无法单击“确定”或“取消”。因此,您将使用回调来处理这种情况。更像这样的东西:
function clickSubmit() {
//validate data
dialogOK.onclick = function () {
//submit
}
dialogCancel.onclick = function () {
//cancel
}
//show confirmation dialog
}
这样,一旦显示对话框,该函数将放弃唯一的 JS 执行线程,但一旦用户选择确认或取消,就会有效地恢复执行。使用闭包范围允许您创建一个持久的执行上下文,这样您就不会“丢失跟踪”您的数据,即使该函数正在将 CPU 交给其他任务。
现实生活中可能需要根据具体情况进行一些调整,但这是您可以用来实现所需功能的一般结构。
希望我理解你的问题。在细节上有点稀疏。
顺便说一句,XMLHttpRequest
它的方式是利用本机浏览器功能。不过,它实际上并不需要在等待响应时“阻塞”。它可以简单地告诉浏览器引擎发送一个 HTTP 请求,然后在响应出现时通知它。非常类似于 AJAX 在实践中的工作方式。
是的,您可以setTimeout
通过setInterval
它定期控制浏览器以防止“挂起”。你可以看看jQuery ASync 插件