我正试图在嵌套的匿名函数中破坏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);
};
我真的不知道如何解决这个问题。显然,问题是它无法找到标签。我该如何解决这个问题?
答案 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
}