使循环不挂起浏览器

时间:2012-12-16 15:59:12

标签: javascript loops blocking

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

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

2 个答案:

答案 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)

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