如何使javascript中断?我能用代码做吗?

如何使javascript中断?我能用代码做吗?,javascript,jquery,Javascript,Jquery,我正在处理一种大约4000个元素的“大”JSON对象,为不同的方法传递,我想用一个显示过程的文本更新一个div标记 但出于某种奇怪的原因(刚刚在Firefox和Chrome中测试过),它们没有用文本更新DOM对象 $("#estatusBar").text(_item.Centro_de_trabajo); 他们都喜欢继续计算所有数据和其他过程,而不需要花时间更新文本。但是,如果我只是在循环中编写一个警报(“”),然后在chrome中单击“选中框”,说忽略所有其他警报,chrome会突然开始更

我正在处理一种大约4000个元素的“大”JSON对象,为不同的方法传递,我想用一个显示过程的文本更新一个
div
标记

但出于某种奇怪的原因(刚刚在Firefox和Chrome中测试过),它们没有用文本更新DOM对象

$("#estatusBar").text(_item.Centro_de_trabajo);
他们都喜欢继续计算所有数据和其他过程,而不需要花时间更新文本。但是,如果我只是在循环中编写一个
警报(“”
),然后在chrome中单击“选中框”,说忽略所有其他警报,chrome会突然开始更新文本

所以我在想,是否可以用某种代码“暂停”计算,停止并更新DOM元素,然后继续进行另一个过程

这是可能的吗?或者这种奇怪行为的替代品是什么

--编辑--

这是循环的代码

    $.each(plantillas, function(_index, _item){
        updateBar(_item.Centro_de_trabajo);
        calculateItem(_item,_index);
        a.push("<div class='blockee'><ul>"+ /*temp.join("")*/ t(_item) +"</ul></div>");
    }); 
$。每个(plantillas,函数(\u索引,\u项目){
更新栏(_item.Centro_de_trabajo);
计算项目(_项目,_索引);
a、 推动(“
    ”+/*温度连接(“”*/t(\u项)+“
”); });
您可以尝试使用,将计算推迟到后台,这应该会对您有所帮助。Web工作者被设计来做这件事(将大型计算推送到后台线程)。但是,这可能不适用于所有浏览器。您主要关心的是IE,只有IE 10支持它:


您想要javascript中的等待、暂停、睡眠或类似版本吗

唯一的办法是与

window.setTimeout()
您可以使用它暂停任何函数

查看此帖子也可能会有所帮助:

不,您无法执行警报所执行的操作。这种限制在某些情况下确实令人恼火,但如果您的问题只是单个长计算的一个过程,那么解决方案很简单

不是在一个循环中完成所有记录,而是将计算分成“足够小”的块,然后执行如下操作

function doit()
{
    processBlockOfRecords();
    updateProgressBar();
    if (!finished()) {
        setTimeout(doit, 0);
    }
}

setTimeout(doit, 0);
使用这种方法,添加“中止”按钮以停止计算也很简单

在您的示例中,循环是

$.each(plantillas, function(_index, _item){
    updateBar(_item.Centro_de_trabajo);
    calculateItem(_item,_index);
    a.push("<div class='blockee'><ul>"+ /*temp.join("")*/ t(_item) +"</ul></div>");
});
$。每个(plantillas,函数(\u索引,\u项目){
更新栏(_item.Centro_de_trabajo);
计算项目(_项目,_索引);
a、 推动(“
    ”+/*温度连接(“”*/t(\u项)+“
”); });
因此,计算可以拆分为(未测试)

函数processRecords(plantillas,completion\u回调){
var=0;
var结果=[];
函数doit(){
//一次最多处理20条记录

对于(var i=0;iYou需要使用计时器(setInterval/setTimeout)将处理拆分为块。可以使用Web workers,但这会限制使用较旧浏览器的处理。好的,让我试试……谢谢在您的场景中,您应该查看回调而不是超时/间隔。如果需要更多代码,请显示更多代码help@hop我认为基本上这是正在发生的,但这个解决方案包括作为Vivin Pal的webworkesiath建议我认为这是一个完整的答案,但是do-it功能应该进入循环内部?我对这个概念不是很清楚。我正在更新我的问题。使用代码。。。
function processRecords(plantillas, completion_callback) {
    var processed = 0;
    var result = [];

    function doit() {
        // Process up to 20 records at a time
        for (var i=0; i<20 && processed<plantillas.length; i++) {
            calculateItem(plantillas[processed], processed);
            result.push("<div class='blockee'><ul>" +
                        t(plantillas[processed]) +
                        "</ul></div>");
            processed++;
        }

        // Progress bar update
        updateProgress(processed, plantillas.length);

        if (processed < plantillas.length) {
            // Not finished, schedule another block
            setTimeout(doit, 0);
        } else {
            // Processing complete... inform caller
            if (completion_callback) completion_callback(result);
        }
    }

    // Schedule computation start
    setTimeout(doit, 0);
}