2013-07-25 24 views
2

我有一個第三方JavaScript對象,我在其上調用方法「搜索」,並將搜索查詢字符串和函數一起傳遞,以便在搜索完成後執行。該第三方對象然後消失並嘗試從服務中檢索數據。如果服務調用在10秒內未能返回,則第三方對象會記錄一個超時錯誤,但不幸的是不會執行狀態爲「超時」或其他適用的回調函數。在閉包中調用setTimeout會導致內存泄漏?

爲了讓時出現了超時回調執行,我裹第三方對象調用按照下面的代碼:如果正在創建一個閉合

var SEARCH_TIMEOUT_MILLISECONDS = 10500; 

var thirdPartyObject = ... // Global variable 

function search(searchTerm, onCompleteCallback) { 

    var searchTimeoutHandler = setTimeout(function() { 
     onCompleteCallback(null, 'TIMEOUT'); 
    }, SEARCH_TIMEOUT_MILLISECONDS); 

    thirdPartyObject.search({ 
     searchTerm: searchTerm, 
     onComplete: function (searchResponse, status) { 

      clearTimeout(searchTimeoutHandler); 

      onCompleteCallback(searchResponse, status); 
     } 
    }); 
} 

,如果這函數被調用了幾百次(一些併發),在setTimeout函數的情況下是否存在任何內存問題,無論是否被調用?

+0

這裏最糟糕的情況是超時函數似乎不會中止搜索,因此如果搜索在10.5秒後返回,那麼即使onCompleteCallback(null,'TIMEOUT'),onCompleteCallback(searchResponse,status)已經執行了。 –

回答

0

不,不應該有任何內存泄漏。就超時而言,只有兩種情況:

  • 超時處理程序被調用,之後它被垃圾收集。
  • 超時被清除,之後它也被垃圾收集。

但是,如果您有多個搜索正在做數百次,這些超時處理程序可以堆積起來,但他們最終將採取最多n * SEARCH_TIMEOUT_MILLISECONDS,其中n是被稱爲次search數之後被清除(這也是您將擁有的超時處理程序的實例數量)。所以沒有內存泄漏本身,但你可以把東西堆疊起來。您可能需要調整SEARCH_TIMEOUT_MILLISECONDS變量,以免堆疊起來。您還可以查看Chrome開發者工具的內存使用情況,以查看有多少內存被用完。

+0

感謝您的回答。有意義的是,一旦超時處理程序被調用但是並不完全確定,閉包應該被垃圾收集。必須更多關注Chrome中的內存使用工具。 – JonUK