在同步异步操作时是否可以使for
和while
循环不挂起浏览器?
我问这是因为同步XMLHttpRequest
仅阻止UI事件,但不会完全挂起浏览器。我希望循环具有相同的行为。
答案 0 :(得分:2)
我认为你可能会对这个问题有点不对劲。 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在实践中的工作方式非常相似。
答案 1 :(得分:0)
是的,可以使用setTimeout
和setInterval
来定期控制浏览器以防止“挂起”。您可以查看jQuery ASync plugin