2015-10-07 127 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); 
    } 
}