从匿名函数中中断for循环

Break a for loop from within an anonymous function

本文关键字:中断 for 循环 函数      更新时间:2023-09-26

我正试图从嵌套的匿名函数中中断一个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);
};

我真的不知道怎么解决这个问题。显然,问题是它找不到标签。我该如何解决此问题?

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

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);

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

然而,在您的特定情况下,由于您正在调用setTimeout,所以在您甚至可以设置值时,循环的执行可能已经完成。setTimeout将函数调度为稍后执行(以毫秒为单位)。

如果某个变量标记为已完成,则可以使用该变量提前退出匿名函数。

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

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