Javascript JS有时会因计时器混乱而崩溃
我的Javascript计时器适用于使用rubiks多维数据集的人,该多维数据集生成一个加扰(尽管如此,但我只是告诉你,我在每次解算后生成一个新的加扰),我的加扰实际上有一个Javascript JS有时会因计时器混乱而崩溃,javascript,oop,browser,crash,prototype,Javascript,Oop,Browser,Crash,Prototype,我的Javascript计时器适用于使用rubiks多维数据集的人,该多维数据集生成一个加扰(尽管如此,但我只是告诉你,我在每次解算后生成一个新的加扰),我的加扰实际上有一个while(true)语句。这确实会使我的脚本崩溃,但95/100次在脚本崩溃之前停止,但我不想有任何时间 让我更详细地解释一下这个问题 问题:javascript崩溃,因为我的脚本需要太长时间才能生成置乱。 下面是我使用的3个函数。 此函数使用Fisher-Yates shuffle生成一个扰码 Timer.prototy
while(true)
语句。这确实会使我的脚本崩溃,但95/100次在脚本崩溃之前停止,但我不想有任何时间
让我更详细地解释一下这个问题
问题:javascript崩溃,因为我的脚本需要太长时间才能生成置乱。
下面是我使用的3个函数。
此函数使用Fisher-Yates shuffle生成一个扰码
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;
};
var scr=[“F”,“R”,“U”,“B”,“L”,“D”,“F2”,“R2”,“U2”,“B2”,“L2”,“D2”,“F'”,“R',“U',“B',“L',“D'”]
Timer.prototype.validateScamble2=函数(数组){
var last=array.length-1;
对于(var i=0;i
上述函数正在等待调用。在下面的函数中,我使用它们
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;
};
Timer.prototype.updateScamble2=函数(扰码、len、类型){
var self=这个;
var-scramble='',j,updatedArr=[];
while(updatedArr.length
我想你们都明白,但让我简单解释一下。
第一个while循环
将给定数组中的随机值(扰码arr)添加到名为updatedArr
的新数组中
如果F2旁边的数组F中没有,则下一个while循环
调用validateScamble2()
函数
for循环的for
将它们添加到一个添加了空格的新变量中,然后我们在div中显示加扰:scramble div.innerHTML=scramble代码>
了解这些信息后,我需要知道什么?
我想知道为什么我的updateScamble2()
函数每次都让我的浏览器崩溃,我做错了什么,我应该怎么做。我不完全确定我是否理解这个问题,但从你的代码看起来,我认为你有一个无限循环。似乎validateScamble2
总是返回false
,这会导致updateScamble2
中的第二个循环永久运行
我建议您在代码中插入断点并检查值。您还可以插入调试器代码中的代码>语句的工作方式相同。在执行这些操作之前打开开发工具
建议不要使用循环,而是使用计时器。这会将循环分解为异步迭代而不是同步迭代。这允许浏览器为其他操作留出喘息空间。下面是一个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);
});
你可以更进一步,使用承诺而不是回调。它确实会返回很多真实的结果。它从数组A中获取随机值并放入一个名为B的新数组(例如),然后检查F2附近是否没有F。但有时,我想这会花太长时间,然后浏览器会说:“好吧,我们暂停脚本。这太长了。我们认为这是一个无限循环。”@KimKoomen添加了一个使用计时器的异步循环的例子。与论坛网站不同,我们不使用“谢谢”、“感谢任何帮助”或签名。顺便说一句,这是“提前感谢”,而不是“优势感谢”。