2016-02-19 57 views
2

我在使用jquery構建Simon說遊戲http://codepen.io/meek/pen/adrbOv,我在逐個回放每個聲音時遇到了一些麻煩。爲什麼我的循環不會在迭代之間等待? setTimeout()

當遊戲開始時,會產生20個聲音(「移動」)的列表,每個回合會逐個播放。因此,如果移動列表是['紅色','黃色','綠色'],則將會播放一個'紅色',然後輪播兩個'紅色'和'黃色',依此類推。

我已經設置了輪到4,我試圖讓每個聲音一個接一個播放,直到播放4個聲音。我使用此代碼:

turn = 4; 
var t = 1; 
    while(t <= turn) { 
    setTimeout(AIbutton(allMoves[t-1]), 1000); 
    t++; 
    } 

AIbutton()是播放聲音(模擬按下一個按鈕)和allMoves是20個移動將在整個遊戲中扮演列表功能。我想讓它發生的是在循環的每次迭代中播放聲音,然後再進入下一次迭代,但是會發生的一種情況是循環中的所有聲音在1000 ms的時間間隔後同時迭代播放。

我以爲setTimeout會讓它在迭代之間暫停嗎?我怎樣才能做到這一點?

回答

5

setTimeout異步運行,它不阻塞。如果你想等待超時完成,下一個「循環迭代」需要在你給setTimeout的函數回調中發生。

像這樣的東西會工作:

turn = 4; 
var t = 1; 
ourTimeout(allMovies, turn, t); 

function ourTimeout(allMovies, turn, t){ 
    AIbutton(allMoves[t-1]); 
    if(t <= turn) 
     setTimeout(ourTimeout(allMovies, turn, ++t), 1000); 
} 

@Alnitak提到,這行代碼:

setTimeout(ourTimeout(allMovies, turn, ++t), 1000);` 

需要改變這樣:

setTimeout(function(){ 
     ourTimeout(allMovies, turn, ++t); 
    }, 1000); 

由於@Alnitak狀態,你只能傳遞一個匿名或命名的函數setTimeout。傳遞變量的技巧是在上面提到的變化中完成的(概念被稱爲閉包)。

+1

此代碼不正確 - 您需要將函數引用傳遞給'setTimeout'(例如匿名函數表達式),而不是調用'ourTimeout'的結果。 – Alnitak

+0

這正是我所需要的,我明白爲什麼現在。謝謝! – mlamp