iT邦幫忙

0

setTimeout的問題

  • 分享至 

  • xImage

我知道以下的程式碼是錯的。因為vscode有報錯

for(var i = 0; i <= 10; i++){
	setTimeout(()=>{
		console.log(123)
	},1000)
}

但是我依照網路上的方法,修改了一下程式碼。vscode的錯誤沒了。

for(let i = 0; i <= 10; i++){
	setTimeout(()=>{
		console.log(123)
	},1000)
}

但是依舊沒有setTimeout的效果。就是沒有隔1秒顯示,而是1秒後全部顯示。

greenriver iT邦研究生 4 級 ‧ 2022-04-11 08:49:39 檢舉
for(let i = 0; i <= 10; i++){
setTimeout(()=>{
console.log(123)
},1000 * (i+1))
}
dophintil iT邦新手 4 級 ‧ 2022-04-11 16:01:54 檢舉
下面大大解釋很多
樓主也可以搜尋一下settimeout vs. setinterval
javascript會一口氣把程式執行完(不會等settimeout的結果)
所以您寫的概念上是一口氣堆積10個console.log,在1秒後爆發
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
冰塊
iT邦新手 5 級 ‧ 2022-04-09 13:02:12
最佳解答
let timeout = (x) => { 
  console.log (123);
  x ++;
  if (x <= 10){
    setTimeout (() => {timeout (x);}, 1000);
  }
};

timeout (0);

迴圈會在一瞬間執行完
所以全部會一起一秒後執行 試試這個吧

3
undefined
iT邦新手 5 級 ‧ 2022-04-09 12:20:50
for(let i = 0; i <= 10; i++){
	setTimeout(()=>{
		console.log(123)
	},1000 * i)
}
undefined iT邦新手 5 級 ‧ 2022-04-09 12:26:22 檢舉
let idx = 0;
t = setInterval(() => {
    if (idx >= 10) {
        clearInterval(t)
    }
    console.log(123)
    idx += 1
}, 1000)
undefined iT邦新手 5 級 ‧ 2022-04-09 12:31:12 檢舉
let idx = 0;
const fn = () => {
    console.log('123')
    idx += 1
    idx <= 10 && setTimeout(fn, 1000)
}
fn()
3
Homura
iT邦高手 1 級 ‧ 2022-04-09 13:01:53

你觀念錯了啊
for迴圈每一次花不到0.01秒就跑完
看起來就像是10次setTimeout一次跑完
你要每隔一秒輸出一次應該要改用setInterval

setInterval(()=>{
		console.log(123)
	},1000)
0

用此方法連迴圈都不需要

let time = 0
// 創建定時器
let temp = setInterval(()=>{
    console.log(123)
    time++
    // 清除定時器
    if(time == 10) clearInterval(temp)
},1000)
0
iT邦新手 1 級 ‧ 2022-04-09 14:43:40

需要等待的話,我會使用以下方法供參考:

;(async () => {
  const buildPromise = () =>
    new Promise((resolve) =>
      setTimeout(() => {
        console.log(123)
        resolve()
      }, 1000)
    )

  for (let i = 0; i < 10; i++) {
    await buildPromise()
  }
})()

還有更多方法可以參考。

1
fillano
iT邦超人 1 級 ‧ 2022-04-09 18:31:45

用closure的話,包一層function就解決。

for(var i = 0; i <= 10; i++){
	(function(x) {
        setTimeout(()=>{
            console.log(x)
        },1000);
    })(i);
}

我要發表回答

立即登入回答