0

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

我问这个是因为同步XMLHttpRequest只会阻止 UI 事件,但不会完全挂起浏览器。我想有相同的循环行为。

4

2 回答 2

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 在实践中的工作方式。

于 2012-12-16T16:28:59.120 回答
0

是的,您可以setTimeout通过setInterval它定期控制浏览器以防止“挂起”。你可以看看jQuery ASync 插件

于 2012-12-16T16:02:07.977 回答