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