JS有时会因Timer争夺而崩溃

时间:2015-03-15 09:41:03

标签: javascript oop browser crash prototype

我的Javascript计时器适用于拥有rubiks多维数据集的人生成一个争夺(永远不要告诉你所有这些,但只是告诉你我每次解决后都会生成一个新的争夺)并且我的争夺实际上有一个{{ 1}}陈述。所以这会导致我的脚本崩溃,但它会在脚本崩溃之前停止95/100次,但我不想有任何时间。

让我解释一下这个问题的更多细节。

问题:javascript崩溃是因为我的脚本耗时太长而无法生成争夺。

下面你有我使用的3个功能。 这个函数用Fisher-Yates shuffle产生一个争夺。

while (true)

此功能验证输入,例如我收到一个数组如下:

这里我只需要检查第一个字符。这就是我使用秒Timer.prototype.generateScramble = function(array) { for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = array[i]; array[i] = array[j]; array[j] = temp; } return array; }; 表示法的原因。我不希望人们用F2获得F,例如

[ ]

上述功能只是等待被调用。在下面的函数中,我使用它们。

var scr = ["F","R","U","B","L","D","F2","R2","U2","B2","L2","D2","F'","R'","U'","B'","L'","D'"]

Timer.prototype.validateScramble2 = function(array) {
    var last = array.length-1;
    for (var i = 0; i < array.length-1; i++) {
        if (array[i][0] == array[i+1][0]) {
            return false;
        }
    }
    for (var i = 0; i < array.length-2; i++) {
        if (array[i][0] == array[i+2][0]) {
            return false;
        }
    }

    if (array[0][0] == [last][0]) {
        return false;
    }

    return true;
};

我认为你们理解它,但让我简单解释一下。 第一个Timer.prototype.updateScramble2 = function(scrambleArr, len, type) { var self = this; var scramble = '', j, updatedArr = []; while (updatedArr.length < len) { j = (Math.floor(Math.random() * scrambleArr.length)); updatedArr.push(scrambleArr[j]); } while (!self.validateScramble2(updatedArr)) { updatedArr = self.generateScramble(updatedArr); } for (var i = 0; i < updatedArr.length; i++) { scramble += updatedArr[i] + ' '; } scrambleDiv.innerHTML = scramble; }; 将给定数组(scrambleArr)中的随机值添加到名为while-loop的新数组中。

如果F2旁边没有数组F,则下一个updatedArr会调用while-loop函数。

validateScramble2()将它们添加到添加了空格的新变量中,然后我们在div中显示加扰:for-loop

所有这些信息后我需要知道什么?

我想知道为什么我的scrambleDiv.innerHTML = scramble;函数让我的浏览器每次都崩溃,我做错了什么以及我应该怎么做。

1 个答案:

答案 0 :(得分:0)

我不完全确定我理解这个问题,但从你的代码看起来的方式来看,我认为你有一个无限循环。似乎validateScramble2始终返回false,这会导致updateScramble2中的第二个循环永久运行。

我建议你在代码中插入一个断点并检查值。您也可以在代码中插入debugger;语句,以相同的方式工作。在执行这些工具之前打开开发工具。


建议不是使用循环,而是使用计时器。这会将您的循环分解为异步迭代而不是同步。这允许浏览器为其他操作提供喘息空间。以下是forEachAsync

的示例
function forEachAsync(array, callback){
  var i = 0;
  var timer = setInterval(function(){
    callback.call(null, array[i]);
    if(++i >= array.length) clearInterval(timer);
  }, 0);
}

forEachAsync([1,2,4], function(item){
  console.log(item);
});

你可以进一步使用Promise而不是回调。