1

我已经用 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" />

谢谢

4

3 回答 3

6

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

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

于 2012-05-15T19:10:05.037 回答
0

JavaScript 是单线程的,所以总是只有一种方法在运行。一旦longLoop开始,就什么都做不了了。您可以通过使用新的HTML5 web workers来规避这个限制。

于 2012-05-15T19:12:44.363 回答
0

JavaScript不是多线程语言,即使你使用 setTimeout,它也在主线程中运行,你只是推迟操作,你应该看看Web-Workers,用于在后台运行 cpu 密集型任务的新 JavaScript API

于 2012-05-15T19:14:09.147 回答