2016-09-08 56 views
2

上下文: 我在搞遊戲的想法,只是爲了好玩,而我在html5的canvas和javascript中做,只是因爲我想練習,而我是愚弄周圍。多個超時或Javascript中的多個調用

問題: 在我的比賽有很多事情會發生在一個不同的時間,而新的事情要做不斷產生。精度不是必需的,只要在幾秒鐘內。

我的第一個想法是簡單地創建一個數組,手動排序,通過基於執行時間插入新任務,然後我將在超時時設置一個函數,它將獲取新任務,處理它,等待下一個詢問的時間,並等待超時,當添加一個新的項目時,它將檢查是否新的在線,並適當地改變超時。

這聽起來比現在更復雜。

但後來我開始懷疑....會是什麼設置許多定時器的陷阱? 起初我認爲設置很多定時器是個不錯的主意,但後來我開始懷疑瀏覽器是否可以像我上面提到的那樣處理時間,或者其他有效的方式。

所以基本上,總結一下我的擔憂: 什麼是使用多個超時,VS只是做了一個又一個的問題。 這種方法有什麼缺陷嗎?或任何「陷阱」

感謝先進!

+0

不知道這是你的選擇,但也許你可以用一個超時創建遞歸併調用多種功能與它所以像這樣https://jsfiddle.net/Lg0wyt9u/1220/。 –

+0

你也可以用'requestAnimationFrame'來做到這一點https://jsfiddle.net/Lg0wyt9u/1221/ –

回答

1

了我的頭頂部,有一件事你應該記住的是,一個超時是你必須分配一個變量。如果您想在觸發之前取消該超時,則需要使用其句柄清除Timeout()。如果你有很多人,你的代碼可能會混淆工作。

此外,JavaScript是單線程的,因此沒有動作可同時執行。當然,它的速度足夠快,可以立即感受到,但是有一個堆棧順序不會有什麼不同。

在這一天結束這是你的選擇的代碼,但是你最喜歡的,所以無論你選擇做一個大的全局處理函數或多個小型專用的人是你的:)

+0

我明白所有這些,但是現場幕後超時工作是我的問題,我很害怕,花費一堆資源或其他東西。 感謝你的思想框架,它有助於把它如何可能在我腦海中的作品的圖片。 –

+0

據我所知,內部超時是放在瀏覽器的計時器線程,這是從js線程分開。他們會像他們一樣倒計時,一旦他們完成,他們把回調放入js線程中。 [編輯:所以如果你擔心表演,這絕對不是一個問題,直到你有成千上萬;]] – tomiy

0

設置多個超時會不會影響你的表現,所以你應該停止擔心這一點。 Node.js內部handles timeouts in a similar manner to yours idea。如果你想看到一些例子,看看下面的代碼片段:

let count = 10000; 
 

 
console.time('Total time') 
 

 
for (let i = 0; i < count; ++i) { 
 
    setTimeout(() => { 
 
    if (--count === 0) { 
 
     console.timeEnd('Total time') 
 
    } 
 
    }, i/10); // Set 10 timeouts for each millisecond 
 
}

理想的情況下它的執行應該採取完全相同1000毫秒,你可以看到,真正的結果是不遠處的這一點。