Javascript JS有时会因计时器混乱而崩溃

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

我的Javascript计时器适用于使用rubiks多维数据集的人,该多维数据集生成一个加扰(尽管如此,但我只是告诉你,我在每次解算后生成一个新的加扰),我的加扰实际上有一个
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添加了一个使用计时器的异步循环的例子。与论坛网站不同,我们不使用“谢谢”、“感谢任何帮助”或签名。顺便说一句,这是“提前感谢”,而不是“优势感谢”。