嘿,当用户按下停止按钮退出循环时,我一直很难让我的代码识别出来。我知道它是一个线程问题,但我一直试图使用setTimeout / setInterval来解决这个问题。
在我的代码中,我有一个onclick="stop()"
按钮,其功能为stop(){cancel = true;}
。在我的代码中,我有一个.each循环,它遍历某些行一定次数(取决于选中的复选框的数量)。每次迭代都会调用Row(this);
,除了一些检查和getter之外,它还包含一个迭代当前行总长度的for循环。如下所示:
for (i = 0; i < row.length; i++) {
ajaxCallForRowSingle(row[i]);
if (stop == true) {
return false; }
}
我已经尝试了setTimeout(ajaxCallForRowSingle(row[i]),0);
但是我得到了#34;找不到语法错误标签&#34;我假设是来自ajax调用。有没有解决这个问题?按下按钮总是排队并在循环后执行。
答案 0 :(得分:1)
好的,这就是你需要做的......
而不是使用&#39; for&#39;循环,创建一个函数,并使用,&#39; setTimeout&#39;递归调用它。或者&#39; setInterval&#39;
var iRowsToProcess = row.length;
var iRowIndex = 0;
var processRows = function(){
if (!stop){
ajaxCallForRowSingle(row[iRowIndex]);
iRowIndex++;
if (iRowIndex < iRowsToProcess){
setTimeout(processRows, 1);
};
};
};
setTimeout(processRows, 1);
此代码将调用&#39; processRows&#39;递归地直到所有行都被处理,或者直到“停止”。是假的。美丽是每一个,&#34; setTimeout&#34;调用是异步处理的,这意味着它允许其他JS代码在再次调用之前进行更新。它释放了所有JS代码同步等待的一个线程。
答案 1 :(得分:0)
我认为你正在寻找一个自称而不是for循环的递归函数。另外,要打破for循环,我会使用“break”而不是尝试返回false。
设置一个递归函数来继续调用自己,直到你找到你正在寻找的row.length。
答案 2 :(得分:0)
如果你想使用setTimeout或setInterval,你必须将ajaxCall包装在另一个函数中,例如,
setInterval(function () {
ajaxCallForRowSingle(row[i]);
}, 0);
您可以通过将其ID存储为变量来清除间隔,然后调用clearInterval,例如,
var i = 0;
var id = setInterval(function () {
ajaxCallForRowSingle(row[i]);
i++;
if (i >= row.length) { clearInterval(id); }
}, 0);
var stop = function () {
clearInterval(id);
}