SetTimeout函数仍然使UI无响应,直到其操作结束

时间:2012-05-15 19:08:38

标签: javascript jquery

我已经使用setTimeout函数包装了长时间运行的逻辑(longLoop),但是在长时间运行执行之前,UI仍然没有响应。它不允许单击其他UI按钮。请查看下面的示例,如果您发现任何问题,请告诉我。

function longLoop () {
    var startLogTime, endLogTime;
    startLogTime = new Date().getTime();
    console.log("loop begin");
    for (var i = 0; i <= 500000000; i++) {
        var j = 10;
    }
    endLogTime = new Date().getTime();
    console.log("loop execution takes " + (endLogTime - startLogTime) + " milliseconds");
}

$(document).ready(function () {

    $("#btnButton").bind("click", function () {
        setTimeout(longLoop, 15);

    });

    $("#anotherButton").bind("click", function () {
        console.log("another operation clicked");
    });
});

<input type="button" id="btnButton" value="Start Long Operation" />
<input type ="button" id="anotherButton" value= "Another operation" />

由于

3 个答案:

答案 0 :(得分:6)

即使它是“异步”,setTimeout仍会在主事件循环上调度其调用。由于主事件循环还接收点击,键盘输入以及网页可能发送的每个事件,因此您只是推迟了长时间操作冻结UI的时刻。

如果你想与主事件循环并行运行你的操作,你应该研究Web workers,它产生真正的线程(带有一些重要的约束)。

答案 1 :(得分:0)

JavaScript是单线程的,因此始终只有一个方法在运行。 longLoop启动后,就无法完成其他工作。您可以使用新的HTML5 web workers来规避此限制。

答案 2 :(得分:0)

JavaScript is not a mutithreaded language,即使你使用setTimeout,它在主线程中运行,你只是推迟操作,你应该看看Web-Workers,用于运行cpu密集的新JavaScript API背景中的任务