Javascript 循环后按钮响应

Javascript 循环后按钮响应,javascript,jquery,Javascript,Jquery,我有一个使用jquery的应用程序,它通过一系列复选框进行迭代 当它遍历时,我有一个对话框显示打印会话的状态。我还有一个取消按钮来取消会话 <input type="button" id="cancelButton" onclick="cancel()"> function cancel() { stop = true; } 函数cancel(){ 停止=真; } 通过每次迭代,我检查stop是否为真,如果为真,我将跳出循环。但问题是,如果我在

我有一个使用jquery的应用程序,它通过一系列复选框进行迭代

当它遍历时,我有一个对话框显示打印会话的状态。我还有一个取消按钮来取消会话

<input type="button" id="cancelButton" onclick="cancel()">

    function cancel() {
        stop = true;
    }

函数cancel(){
停止=真;
}

通过每次迭代,我检查
stop
是否为真,如果为真,我将跳出循环。但问题是,如果我在会话期间按下cancel按钮,cancel功能将仅在
每次循环后运行(有点违背目的)。有没有办法使按钮更灵敏,或者有更好的方法来实现这一点

在单独的线程中运行函数

setTimeout(function() { $('[name=check]:checked').each(function() {
    printingFunction();
}); }, 1);

您可以链接
setTimeout
s,以便检查是否停止。您仍然需要等待当前操作完成,但这会让您打破循环

function next()
{
    printingFunction();
    if (!stop && someOtherCheck)
        setTimeout(function() { next(); }, 1);
}

next();

我认为您不能中断
。每个
循环都是单线程的JavaScript执行。

但是我认为计时器是异步执行的,您可以尝试下面的方法来取消和清除

下面的逻辑可能会让你达到目的

var timeouts = [];

$.each(someArray, function(index, value){
    timeouts.push(setTimeout(function(){
          console.log(index);
     },5000*index));
});


$('#cancel-button').click(function(){
    $.each(timeouts, function (_, id) {
       clearTimeout(id);
    });

    timeouts = [];
}):

<强>也<>强,如果上面没有帮助,你可以考虑玩。

再次尝试-我改变了将清除IE 11中的错误的Shift语句:

var ele = Array.prototype.shift.call($checked);
您需要在每个循环调用上使用setTimeout(可以设置为0),这样cancel函数就有机会执行了,如下所示:

function cancel() {
    stop = true;
}
function printingFunction() {
    var x = 0;
    while (x < 10000){
        x+=1;
    }
}

function printLoop($checked) {
    if (stop) {
        console.log('Stopped - button pushed')
    } else {
        if ($checked.length > 0) {
            var ele = Array.prototype.shift.call($checked);
            printingFunction()
        }
        if ($checked.length > 0) {
            setTimeout(function(){printLoop($checked)}, 0);
        } else {
            console.log('Stopped - array depleted')
        }

    }

}

var stop = false,
        $checked = $('[name=check]:checked');

printLoop($checked)
函数取消(){
停止=真;
}
函数打印函数(){
var x=0;
而(x<10000){
x+=1;
}
}
函数printLoop($checked){
如果(停止){
console.log('停止-按钮按下')
}否则{
如果($checked.length>0){
var ele=Array.prototype.shift.call($checked);
打印函数()
}
如果($checked.length>0){
setTimeout(函数(){printLoop($checked)},0);
}否则{
console.log('已停止-阵列耗尽')
}
}
}
var stop=false,
$checked=$('[name=check]:checked');
printLoop($checked)

除非您将设置的超时链接在一起,否则我担心这会使它们同时排队,并且您的按钮仍然无法工作。您可能需要这样做:谢谢!我尝试使用该解决方案,但对于
Array.shift($checked)
我不断收到一个错误,告诉我shift()无法识别(我正在使用IE11运行我的应用程序),是否还有其他选择?好奇的是,如果我在
printingFunction()
中的for循环中有一个
printRow()
,是否有任何方法可以模仿你的逻辑?然后我是否可以在
printingFunction()
中进行递归调用?请注意上面的代码编辑。您可以对行执行类似的操作-取决于打印函数实际执行的操作。。。