[問題] setTimeout 在Chrome下的問題

看板Ajax作者 (mhsu2k9)時間14年前 (2011/12/07 01:05), 編輯推噓3(3011)
留言14則, 4人參與, 最新討論串1/1
最近在研讀closure的寫法 有類似以下的範例: function doAlert(j){ var rtrAlert = function(){ alert(j); } return rtrAlert; } for(var i=0;i<=5;i++){ var func = doAlert(i); setTimeout(func,1000); } 以上的code,如果在Firefox下執行,會依序alert出1,2,3,4,5的值 但是若在Chrome下,alert出的數值順序是不規則的 如果把alert(j)這一行,換成document.writeln(j) 則寫出來的數值,又是依照1 - 5 排列的 想請教各位先進該如何解決? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.67.62.205

12/07 01:07, , 1F
關鍵字:async, multi thread
12/07 01:07, 1F

12/07 13:35, , 2F
這沒什麼 只能說chrome的實作比較好 for的速度太快 導致
12/07 13:35, 2F

12/07 13:36, , 3F
settimeout那行送出去還沒丟進queue 已經for下一次了
12/07 13:36, 3F

12/07 13:37, , 4F
參考 http://jsfiddle.net/NSeZw/5/ 在chrome執行
12/07 13:37, 4F

12/07 13:39, , 5F
settimeout 前加一個耗時的 for j loop 我一直把數字調到
12/07 13:39, 5F

12/07 13:39, , 6F
100000 不照順序的情況還是恢復了
12/07 13:39, 6F

12/07 15:04, , 7F
樓上,我跑一樣式不照順序。
12/07 15:04, 7F

12/07 15:09, , 8F
可能電腦太快 再加零囉
12/07 15:09, 8F

12/07 15:25, , 9F
我已經多加兩個 0 ...
12/07 15:25, 9F

12/08 01:25, , 10F
非同步很難保證順序. delay 0, 5, 10, 15ms都不一定會正確
12/08 01:25, 10F

12/08 12:07, , 11F
這跟async,multi thread都沒關係啦 只能說chrome實作把
12/08 12:07, 11F

12/08 12:09, , 12F
settimeout加到queue的實作是在這整個程式執行完才開始
12/08 12:09, 12F

12/08 12:11, , 13F
參考 http://jsfiddle.net/NSeZw/8/ i=0,1,2,3,4,5在所有的
12/08 12:11, 13F

12/08 12:12, , 14F
settimeout不照順序之前 若是有thread 會交錯出現
12/08 12:12, 14F
文章代碼(AID): #1EtajFNL (Ajax)
文章代碼(AID): #1EtajFNL (Ajax)