iT邦幫忙

0

javascript 迴圈裡做時間累加並執行

  • 分享至 

  • xImage
function start_run(){
    for(let id of ids){
        id = id.split(",");
        upd_obj = Markers.findIndex((obj => obj.id == id[0]));
        if (upd_obj != -1) {
            console.log(cancel)
            if (Markers[upd_obj].status == 'e' && cancel==false){
                   if (settime>0) {
                            假設settime=10秒 
                            每次條件達成進來這裡就需要重置時間
                            並在最後時間歸0時 把cancel 改成 true
                        }
                    }
            }else{
                    Markers[upd_obj].status = id[1];
                }
            }
    cancel=false 
    updateall = setTimeout(start_run, 200);

目前參考過:

let timer;
const runTimer = () => {
  timer = window.setTimeout(
    () => {
      document.body.style.backgroundColor = 'black'
    }, 3000);
}
runTimer();
document.body.onclick = () => {
  clearTimeout(timer)
  runTimer()
}

發現setTimeout() 在迴圈裡就被獨立看待,導致會變成多個function在跑setTimeout()
也曾經想用delay,不過程式如果delay會導致資訊update不即時,所以也沒採用。

想請問還有沒有其他寫法能在settime那邊解決重置時間的問題

看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2022-10-26 13:21:41 檢舉
1. 你這個場景適合的是websocket或是sever sent event,不是輪詢,上個問題已經說過你這是架構問題了。
你用伺服器推動的話根本不會遇到這個問題。

2. 實在是看不懂你要啥,不過用一個倒數計時,計時完裡的callback去重設就好。
alanotmt iT邦新手 4 級 ‧ 2022-10-26 13:52:25 檢舉
了解,我去查一下websocket,因為我上面沒有前輩我其實也不知道架構上怎樣會出錯,只能自己摸QQ 謝謝您,我最後也是另外用倒數器。
淺水員 iT邦大師 6 級 ‧ 2022-10-26 14:50:12 檢舉
條件允許的話,用 websocket 會比定時查詢好
但一樣要處理非同步的一些問題
例如 websocket 送資料太快但前端來不及每筆資料都重繪 canvas 的狀況
淺水員 iT邦大師 6 級 ‧ 2022-10-26 14:59:52 檢舉
另外提供一個關鍵字:WebWorker
這可以另外開一個執行緒,拿來做一些複雜的運算,再把結果丟回來
可以避免主執行緒太過忙碌
之前有人寫過心得:https://ithelp.ithome.com.tw/articles/10224677
alanotmt iT邦新手 4 級 ‧ 2022-10-27 10:06:45 檢舉
謝謝你~我再去學一下
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2

用第二個例子

let timer;

改成

var timer;

我要發表回答

立即登入回答