从匿名函数中断开for循环

时间:2013-11-22 00:25:56

标签: javascript

我正试图在嵌套的匿名函数中破坏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);
};

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

通常你要做的是有一个变量,它可以在循环的每次迭代后访问,这表明你是否可以破解。这将在匿名函数中设置。

但是,在您的特定情况下,由于您正在调用setTimeout,因此在您甚至可以设置值时,可能已完成循环的执行。 setTimeout将函数调度为稍后执行(以ms为单位)。

如果某些内容已标记为已完成,您可以使用变量提前退出匿名函数。

答案 2 :(得分:0)

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

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