2016-01-02 28 views
-1

覆蓋setTimeout和我們需要重寫的setTimeout 在行1802,這是我們需要設置或代碼忽略不知何故這個setTimeout的所有 (我的意思是RU),如果我更改版本時顯式更改它在開放源代碼代碼將會丟失的問題,我應該如何覆蓋此setTimout以外僅限於require.js文件並保留它只要我使用這個庫,是否有可能在JS中以優雅的方式做到這一點?如何從我們使用我們的項目<code>require.js</code>外

/** 
* Execute something after the current tick 
* of the event loop. Override for other envs 
* that have a better solution than setTimeout. 
* @param {Function} fn function to execute later. 
*/ 
req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) { 
    setTimeout(fn, 4); 
} : function (fn) { fn(); }; 

這是鏈接的require.js開源Git中 https://github.com/jrburke/requirejs/blob/master/require.js 線1802

+0

爲什麼你需要將它改爲0而不是4ms? –

+0

@RowlandShaw - HI Rowland這是原因http://stackoverflow.com/questions/6032429/chrome-timeouts-interval-suspended-in-background-tabs –

+0

你仍然被限制爲每秒一個呼叫,每個回答那裏 –

回答

3

require對象公開爲全局變量,這樣你就可以覆蓋這樣的方法:

window.require.nextTick = function(fn) { 
    setTimeout(fn, 0); 
} 

但我想不出有什麼好的理由來做到這一點。


不過,這不會解決你的問題,因爲setTimeout通話將被瀏覽反正限制。更好的選擇將是簡單地調用函數:

window.require.nextTick = function(fn) { fn(); }; 

你可以看到需要的來源原來nextTick功能可以根據setTimeout可用性兩個實現 - 一個與setTimeout和一個只有當setTimeout未定義函數調用(您粘貼的代碼段的最後一行)。這就是爲什麼我認爲覆蓋這個像上面這樣的功能不應該導致任何問題的原因。

+0

感謝1+,所以我需要在使用require.js之前使用它,這將覆蓋nextTick?原因是這是http://stackoverflow.com/questions/6032429/chrome-timeouts-interval-suspended- in-background-tabs假設我想覆蓋它我的意思是忽略/刪除setTimeout代碼我只需要把你的代碼沒有setTimeout? –

+0

是的,我還沒有測試過,但它應該工作。即使函數的文檔說它可以被覆蓋。然而,你的實現會引入一些不一致,因爲函數將不再在'next tick'中立即執行代碼。 – xersiee

+0

感謝xersiee,如果我刪除了setTiemout,你說了以下內容:「函數將不再在'next tick'中立即執行代碼,而是立即執行',並且可以提出哪些問題? –