我有一个会生成地图的脚本,但就像现在一样,浏览器认为它正在运行无限循环。我知道它可能会运行很长时间,但它不会影响浏览器。
有没有办法让浏览器继续执行该功能?每当我在浏览器控制台中运行它时,我总是得到“RangeError:超出最大调用堆栈大小”。
我的功能:
function generateMap() {
map = [];
for (i1 = 0; i1 < size; i1++) {
s = '';
for (i2 = 0; i2 < size; i2++) {
var r = getRandomInt(1,oneIn);
if (r == oneIn) s += '1';
else s += '0';
}
map.push(s);
}
if (!mapValid(map)) {
generateMap();
} else {
writeToPage(map, 'map');
}
}
mapValid()
功能相当大,所以我不会在此发布,但可以找到包含mapValid()
功能的整个脚本http://jsfiddle.net/GrV8r/
答案 0 :(得分:1)
Aaron建议打破,这是一种选择。
另一种选择是使用setTimeout
生成地图,如果失败则生成另一个地图。
使用setTimeout
,您可以确保它不会阻止浏览器。
function generateMap() {
map = [];
for (i1 = 0; i1 < size; i1++) {
s = '';
for (i2 = 0; i2 < size; i2++) {
var r = getRandomInt(1,oneIn);
if (r == oneIn) s += '1';
else s += '0';
}
map.push(s);
}
if (!mapValid(map)) {
console.log("Generating another map.");
// Note: There is no () after generateMap. We are passing the function reference.
window.setTimeout(generateMap, 25);
} else {
writeToPage(map, 'map');
}
}
答案 1 :(得分:0)
您的问题是mapValid(map)
没有为数千张地图返回true
。
这意味着递归方法在这里不起作用。改为使用循环:
while(true) {
... generate map ...
if(mapValid(map)) break;
}
这种方法不会耗尽堆栈。出于安全原因,您应该中止循环,但它不会阻止浏览器太长时间:
for(var guard=0; guard<10000; guard++) {
... generate map ...
if(mapValid(map)) {
writeToPage(map, 'map');
return;
}
}
...unable to generate a valid map...