新穎的 setTimeout() 替代方案 scheduler.yield()
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
在前端開發(fā)中,長時間運行的JavaScript任務(wù)一直是一個棘手的問題。它們會導(dǎo)致頁面無響應(yīng),影響用戶體驗。傳統(tǒng)上,開發(fā)者使用 長任務(wù)的問題為了說明長任務(wù)的問題,以下是一個示例,任何字符都有其代碼,但并非所有代碼都有相關(guān)字符。所有非字符代碼都顯示為白色垂直矩形。您可以在下面顯示與一系列代碼相對應(yīng)的字符的頁面中看到許多代碼: ? 有很多垂直的矩形,想把它們過濾掉,通過遍歷一系列Unicode字符代碼,過濾掉未分配的代碼點。
這段代碼在執(zhí)行過程中會使頁面凍結(jié)約4279毫秒,而在此期間,頁面一直處于凍結(jié)狀態(tài)。即使點擊后代碼會首先移除按鈕,但只要代碼還在運行,瀏覽器就無法更新屏幕。代碼運行結(jié)束后,瀏覽器也無法顯示任何字符,按鈕會被移除,字符也會一并顯示, 導(dǎo)致用戶體驗不佳。 因此,在長時間工作時,一定要暫停,讓瀏覽器更新屏幕??梢允褂妙愃频恼Z句暫時中止或中斷長代碼的執(zhí)行. 使用setTimeout()分割任務(wù)傳統(tǒng)的解決方法是使用
這種方法雖然使頁面保持響應(yīng),但執(zhí)行時間顯著增加到約17568毫秒。 setTimeout()的缺點1.最小超時時間為4毫秒,即使指定為0 即使瀏覽器無事可做,主任務(wù)也會暫停至少 4 毫秒。即使指定為零,setTimeout()的最小超時時間 也是 >4 ms。事實上,讓我們來計算一下。在第一頁中,評估 1952 個代碼點需要 4279 毫秒,即每個代碼需要 ~2 毫秒。在第二個頁面中,評估 1952 個代碼點需要 17568 毫秒,即每個代碼點 ~17568/1952=9毫秒。頁面響應(yīng)速度保持不變,但性能下降也令人印象深刻,這主要是由于超時的持續(xù)時間盡可能短。 2.任務(wù)繼續(xù)執(zhí)行時被放置在隊列末尾,可能導(dǎo)致優(yōu)先級問題。 當(dāng)任務(wù)暫停時, 在上面的頁面中,兩個函數(shù)two()同時運行:
當(dāng)?shù)谝粋€two()提交給主線程時,第二個two()會在第一個two()繼續(xù)執(zhí)行之前被執(zhí)行。執(zhí)行時間會稍有增加,從 17 秒增加到 23 秒,但不會增加兩倍,因為大部分運行時間都是由最小超時加起來的。 scheduler.yield():新的解決方案
使用 scheduler.yield()的優(yōu)勢
示例比較:
結(jié)果與上述基于setTimeout()的index4.html的不同之處僅在于執(zhí)行時間。10183 毫秒相當(dāng)于兩次 5645 毫秒。兩個任務(wù)似乎都沒有優(yōu)先級。 優(yōu)先級似乎不起作用,因為兩個函數(shù)three()都不在隊列中等待。但看看這個: 在與 結(jié)語
在實際應(yīng)用中,開發(fā)者可以考慮在處理大量數(shù)據(jù)處理、復(fù)雜計算或頻繁DOM操作等場景時使用 該文章在 2024/10/19 12:30:12 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |