[問題] setTimeout與迴圈的問題

看板Ajax作者 (vincent)時間8年前 (2016/11/24 00:15), 編輯推噓2(2013)
留言15則, 5人參與, 最新討論串1/5 (看更多)
audioPlay=[audio1.play(), audio2.play(), audio3.play(); time=[0, 500, 1000]; for (var i=0; i<3; i++) { setTimeout("audioPlay[i]", time[i]); } 上面這段程式,我希望audio1播完之後 等待500毫秒之後播audio2 再等待500毫秒後播audio3 但是失敗了,我猜迴圈大概不能這樣寫吧! 於是我修改了一下 for (var i=0; i<3; i++) { setTimeout("audioPlay[i]", 500); } 結果還是不行,三個聲音同時出來 看來JavaScript是先等500毫秒 再同時執行前面的三個函數 如果想達到我的目的 不知道該怎麼寫呢? -- -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 104.237.91.82 ※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1479917722.A.D7D.html

11/24 00:29, , 1F
audioPlay=[audio1, audio2, audio3]
11/24 00:29, 1F

11/24 00:29, , 2F
setTimeout(function(){audioPlay[i].play()},time[i
11/24 00:29, 2F

11/24 04:02, , 3F
改成setTimeout(audioPlay[i], time[i]); 應該可行
11/24 04:02, 3F

11/24 04:03, , 4F
因為""裡面是字串 因此i是字元 不會隨著for的i改變
11/24 04:03, 4F

11/24 04:13, , 5F
我記得setTimeout+for loop的話要用IIFE不然i都會是一樣的
11/24 04:13, 5F

11/24 04:13, , 6F
11/24 04:13, 6F

11/24 04:15, , 7F
應該說你第一個解法要搭配IIFE第二個的話可以在setTimeout
11/24 04:15, 7F

11/24 04:17, , 8F
裡另外加兩個setTimeout來跑?
11/24 04:17, 8F

11/24 04:19, , 9F
啊仔細一看前面的連結跟這題沒什麼關https://goo.gl/9YDyp1
11/24 04:19, 9F

11/24 04:19, , 10F
這個比較清楚
11/24 04:19, 10F

11/24 04:30, , 11F
因為當你執行setTimeout時那些i已經變成2了js的變數是跟著
11/24 04:30, 11F

11/24 04:30, , 12F
記憶體的address除非你另外assign一個變數去存
11/24 04:30, 12F

11/24 09:47, , 13F
最早的錯誤是組成陣列時已播放,另外i 的問題可改 setT
11/24 09:47, 13F

11/24 09:47, , 14F
imeout(audoPlay[i].play, time[i])
11/24 09:47, 14F

11/24 21:44, , 15F
感謝幾位大大的指導,我研究看看!
11/24 21:44, 15F
文章代碼(AID): #1ODS2Qrz (Ajax)
文章代碼(AID): #1ODS2Qrz (Ajax)