Generate Loop看起来无限

时间:2014-05-09 07:25:43

标签: javascript infinite-loop

我有一个会生成地图的脚本,但就像现在一样,浏览器认为它正在运行无限循环。我知道它可能会运行很长时间,但它不会影响浏览器。

有没有办法让浏览器继续执行该功能?每当我在浏览器控制台中运行它时,我总是得到“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/

2 个答案:

答案 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...