在Javascript中使用按钮退出for循环

时间:2015-07-13 17:49:07

标签: javascript jquery jquery-ui for-loop

嘿,当用户按下停止按钮退出循环时,我一直很难让我的代码识别出来。我知道它是一个线程问题,但我一直试图使用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调用。有没有解决这个问题?按下按钮总是排队并在循环后执行。

3 个答案:

答案 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);
}