Javascript 从匿名函数中中断for循环

Javascript 从匿名函数中中断for循环,javascript,Javascript,我试图从嵌套匿名函数中断开for循环(标记),如下所示: function ajax(iteration, callback) { var rtrn, xh; if (window.XMLHttpRequest) { xh = new XMLHttpRequest(); } else { xh = new ActiveXObject("Microsoft.XMLHTTP"); }; xh.onreadystatechange

我试图从嵌套匿名函数中断开for循环(标记),如下所示:

function ajax(iteration, callback) {
    var rtrn, xh;
    if (window.XMLHttpRequest) {
        xh = new XMLHttpRequest();
    } else {
        xh = new ActiveXObject("Microsoft.XMLHTTP");
    };
    xh.onreadystatechange = function() {
        if (xh.readyState == 4 && xh.status == 200) {
            callback(xh.responseText);
        };
    };
    xh.open("GET", "file.php?i=" + iteration, true);
    xh.send();
};

var atk_delay = 100;
loop:
for(i = 1; i <= 40; i++) {
    var to = atk_delay * i;
    setTimeout(
        function() {
            ajax(i, function(responseText) {
                var div = document.getElementById("combat");
                div.innerHTML += responseText;
                var arrRt = responseText.split("::");
                if(arrRt[0] == "stop") {
                    break loop;
                };
            });
        },
    to);
};
函数ajax(迭代、回调){
var-rtrn,xh;
if(window.XMLHttpRequest){
xh=新的XMLHttpRequest();
}否则{
xh=新的ActiveXObject(“Microsoft.XMLHTTP”);
};
xh.onreadystatechange=函数(){
如果(xh.readyState==4&&xh.status==200){
回调(xh.responseText);
};
};
open(“GET”、“file.php?i=“+iteration,true”);
xh.send();
};
var atk_延迟=100;
循环:

对于(i=1;i通常,您要做的是在循环的每次迭代后都有一个可访问的变量,该变量将指示您是否可以中断。这将在匿名函数中设置

但是,在您的特定情况下,由于您正在调用
setTimeout
,循环的执行可能已经在您甚至可以设置该值的时间之前完成。
setTimeout
将函数安排到以后执行(毫秒)


如果有东西将匿名函数标记为已完成,您可以使用变量提前退出该函数。

通常,您会在循环的每次迭代后使用一个可访问的变量,该变量将指示您是否可以中断。这将在匿名函数中设置

但是,在您的特定情况下,由于您正在调用
setTimeout
,循环的执行可能已经在您甚至可以设置该值的时间之前完成。
setTimeout
将函数安排到以后执行(毫秒)


如果有什么东西将匿名函数标记为已完成,您可以使用变量提前退出该函数。

所以我解决了它!感谢大家的帮助!您让我意识到我需要一种完全不同的方法

function ajax(callback) {
    var rtrn, xh;
    if (window.XMLHttpRequest) {
        xh = new XMLHttpRequest();
    } else {
        xh = new ActiveXObject("Microsoft.XMLHTTP");
    };
    xh.onreadystatechange = function() {
        if (xh.readyState == 4 && xh.status == 200) {
            callback(xh.responseText);
        };
    };
    xh.open("GET", "file.php", true);
    xh.send();
};

var atk_delay = 100;

function roll() {
    ajax(function(responseText) {
        var div = document.getElementById("combat");
        div.innerHTML += responseText;
        var arrRt = responseText.split("::");
        if(arrRt[0] == "cont") {
            setTimeout(roll, atk_delay);
        };
    });
};

setTimeout(roll, atk_delay);

所以我解决了!谢谢你们的帮助!你们让我意识到我需要一个完全不同的方法

function ajax(callback) {
    var rtrn, xh;
    if (window.XMLHttpRequest) {
        xh = new XMLHttpRequest();
    } else {
        xh = new ActiveXObject("Microsoft.XMLHTTP");
    };
    xh.onreadystatechange = function() {
        if (xh.readyState == 4 && xh.status == 200) {
            callback(xh.responseText);
        };
    };
    xh.open("GET", "file.php", true);
    xh.send();
};

var atk_delay = 100;

function roll() {
    ajax(function(responseText) {
        var div = document.getElementById("combat");
        div.innerHTML += responseText;
        var arrRt = responseText.split("::");
        if(arrRt[0] == "cont") {
            setTimeout(roll, atk_delay);
        };
    });
};

setTimeout(roll, atk_delay);

调试匿名块的简单方法-在要检查的行之前显式调用调试器

function foo().then(s => {
  ... some code
  debugger // here your code will break. 
  someVariableIwantToExamine
}

调试匿名块的简单方法-在要检查的行之前显式调用调试器

function foo().then(s => {
  ... some code
  debugger // here your code will break. 
  someVariableIwantToExamine
}


由于标签的名称错误,我编辑了这个问题。现在代码与我的一样。您是否知道,当您到达要中断它的点时,循环已经停止了?
setTimeout
ajax
显然是异步的,回调中的逻辑发生在循环完成之后,并且
I
>由于新的作用域而丢失。所以这里有两个问题,和ajax是异步的…所以当你发现你的
stop
从我的ajax调用返回responseText时,循环可能又经过了4次,效果非常好,但是,不,我没有意识到,@bažmegakapa。叹气好吧,我基本上需要一个全新的appr我猜是吧。我编辑了这个问题,因为标签的名称不正确。现在代码和我的一样。你知道当你到达想要打破它的点时,循环已经停止了吗?
setTimeout
ajax
显然是异步的,回调中的逻辑发生在循环结束后hed,
i
由于新的作用域而丢失。所以这里有两个问题,而且ajax是异步的……所以当您发现您的
stop
从我的ajax调用返回响应文本时,循环可能已经进行了4次了,这很有魅力,但是,不,我没有意识到,@bažmegakapa。叹气,好吧,我基本上不知道我想这是一个全新的方法。我刚刚意识到。我真的完全错过了。我责备瑞典的时间太晚了。也许我可以使用递归函数?那会很好;你根本无法执行下一步,而不是在需要时尝试中断。我发布了我的解决方案作为答案!谢谢你的时间和建议救命!:-)我才意识到。我真的完全错过了。我责备瑞典这里的深夜。也许我可以用一个递归函数来代替?那会很好;你根本无法执行下一步而不是在需要时尝试中断。我将我的解决方案作为答案发布!谢谢你的时间和帮助!:-)-这与对其调用
eval
相同,它会给表带来所有问题。始终传递函数引用,例如
setTimeout(roll,atk_delay)。哦,我不知道!谢谢@卡帕我认为解决方案通过避免问题来解决问题。这是一个很好的解决方案,但与问题标题并不匹配。我有一个不同的问题,有一个类似的问题标题,但你的解决方案并不真正适合我。我知道你没有做错任何事;我只是说这与对其调用
eval
相同,它会给表带来所有问题。始终传递函数引用,例如
setTimeout(roll,atk_delay)。哦,我不知道!谢谢@卡帕我认为解决方案通过避免问题来解决问题。这是一个很好的解决方案,但与问题标题并不匹配。我有一个不同的问题,有一个类似的问题标题,但你的解决方案并不真正适合我。我知道你没有做错任何事;我只是说。