有誰知道什麼可以導致傳遞到setTimeout(func, 0)
被調用的函數顯着延遲?從setTimeout(func, 0)
執行時間和func
實際調用時間之間,我看到延遲超過1.2秒。什麼可以導致從setTimeout回調延遲(回調,0)
我只看到這種行爲與Chrome v52(v51沒有它)。所以,這可能是一個Chrome的問題,但在我報告它是一個錯誤之前,我想調查它。
我不幸沒有一個可以重新使用它的小案例。它發生在AngularJS應用程序中,以響應滾動事件。我們通過鼠標滾輪來處理滾動事件觸發器,並且作爲其中的一部分,請調用setTimeout(func, 0)
來完成一些後續工作。
使用Chrome devtools,我可以看到在這個1.2秒的差距期間只有很少的JavaScript運行。我沒有阻止線程。事實上,我使用console.profile和console.profileEnd來分析特定的1.2秒圖像。它顯示它在99%的時間裏處於閒置狀態。
看devtools中的時間線,我在那個時間段內看到的唯一一件事就是處理「Mouse Wheel」事件。他們中的很多人(差距的前1秒每5毫秒一次)。這本身有點奇怪,因爲在那段時間鼠標滾輪沒有滾動。我做了一個Mac Magic Mouse的虛擬滾輪的輕拂,我們撞到了可滾動區域的頂部。事件發生後,我們不斷收到鼠標滾輪事件。
有沒有人有任何想法?可以很快執行一小段鼠標滾輪事件來延遲迴調的調用嗎?有什麼方法可以調查爲什麼超時回調在其調度時間後1.2秒被調用?
編輯:添加了描繪setTimeout顯示回調的時間線圖像。
你肯定需要一個可複製的例子來報告它的錯誤,所以請不要猶豫,發佈它。 – estus
'setTimeout(func,0)'將函數放在隊列中,並調度它以調用下一個事件循環或下一個「記號」,換句話說。由於瀏覽器僅爲UI使用單個線程,因此可能會造成一些問題。鼠標滾輪事件可能是相關的,但我不認爲有一個明確的方式來說明沒有檢查他們在做什麼和爲什麼。 – vlaz
我添加了一個顯示時間線的圖像。控制檯正在記錄何時調用'setTimeout'方法以及何時執行回調。在這個例子中,它需要超過1.4秒。摘要圖顯示我們大多數時間都處於閒置狀態。它真的可能是有人在竊取線程嗎? – Steven