使循环不挂起浏览器



同步异步操作时,是否可以使forwhile循环不挂起浏览器?

我之所以这么问,是因为同步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在实践中的工作方式非常相似。

是的,可以使用setTimeoutsetInterval来定期控制浏览器以防止"挂起"。您可以查看jQuery ASync插件

最新更新