我的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;
函数让我的浏览器每次都崩溃,我做错了什么以及我应该怎么做。
答案 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而不是回调。