2015-10-07 210 views
1

我试图混合初始字符串和随机字符串的内容与正确的索引正确的元素进行比较,如果是真的推他们入一组,以重建初始的字符串。这样做,我遇到了问题,while循环什么也不做,只是压缩浏览器。帮我解决这个问题。While循环和setInterval()

function checker() { 
    var text = document.getElementById("inp").value; 
    var a = []; 
    var i = 0; 

    while (a.length < text.length) { 
    var int = setInterval((function() { 
     var rnd = Math.floor(Math.random() * text.length); 
     if (text[rnd] === text[i]) { 
     a.push(text[rnd]); 
     clearInterval(int); 
     i++; 
     } 
    }), 100) 
    } 
} 

P.S.我需要setInterval()函数,因为我需要这个过程发生在完全相同的时间段。

+0

的问题是,你甚至没有得到到第二我。为什么?因为你仍然处在永不结束的间隔函数中。您应该在其他地方清除间隔。我真的不知道你应该在这种情况下做什么。我希望这有助于。 – sandrooco

+0

你想达到什么目的? – Legionar

+0

@Legionar我试图通过随机混合初始创建完全相同的字符串。 AndI希望它可以用setinterval和while循环来完成 – blitzar787

回答

0

所以,你迷迷糊糊进入陷阱大多数人在某些时候打,当他们与异步编程取得联系。

你不能“等待”的超时/间隔来完成 - 试图这样做是行不通或阻止整个页面/浏览器。任何应该在延迟之后运行的代码都需要在回调完成时传递给setInterval的回调中调用。

在我的答案其做的正是你想要的东西 - 正是创建通过随机混合最初,并且还使用setInterval相同的字符串。你没有写出你想要的结果,所以你把它写在控制台中,也在另一个输入字段中,编号为output_string

HTML:

<input id="input_string" value="some_text" /> 
<input id="output_string" value="" readonly="readonly" /> 

的JavaScript:

function checker() { 
    var text = document.getElementById("input_string").value; 
    var result = ''; 

    // split your input string to array 
    text = text.split(''); 

    var int = setInterval((function() { 
     var rnd = Math.floor(Math.random() * text.length); 

     // add random character from input string (array) to the result 
     result += text[rnd]; 

     // remove used element from the input array 
     text.splice(rnd, 1); 

     // if all characters were used 
     if (text.length === 0) { 
      clearInterval(int); 

      console.log(result); 

      document.getElementById("output_string").value = result; 
     } 
    }), 100); 
} 

checker(); 

DEMO

0

老实说,我不知道你正在尝试做的,但你似乎已经记不清如何你的代码是准确操作。

所有while循环呢,是创造的间隔,这是从跑循环本身异步的。 换句话说,你while条件等同于虚假的唯一途径,是经过多次100ms的时间间隔已经过去。将其与1循环迭代的速度进行比较时,100毫秒是永恒的。我们正在查看1000次迭代,然后才会触发第一个setInterval,而不是浏览器能够跟上的,更不用说在更改a.length之前等待其中的几个间隔。

尝试更是这样的:

function checker() { 
    var text = document.getElementById("inp").value; 
    var a = []; 
    var i = 0; 

    // start to do a check every 100ms. 
    var interv = setInterval(function() { 
     var rnd = Math.floor(Math.random() * text.length); 
     if (text[rnd] === text[i]) { 
     a.push(text[rnd]); 
     i++; 
     } 

     // at the end of each call, see if a is long enough yet 
     if(a.length > text.length){ 
     clearInterval(interv); // if so, stop this interval from running 
     alert(a); // and do whatever you need to in the UI. 
     } 
    }, 100); 
    } 
}