2012-03-17 71 views
1

我剛剛注意到安裝Firefox 11後,我在webapp上發現了一些奇怪的行爲。我之前沒有看到過這個錯誤,並且該站點已經運行了一年多。發送函數完成之前是否可以回調完成的XmlHttpRequest觸發器?

var timeOutTimer = null; 

var StartDownload = function() { 
    xhr.open("GET", "/Download", true);   //Notice asynchronous=true 
    xhr.onreadystatechange = DownloadComplete; 
    xhr.send("..."); 

    timeOutTimer = new Timer(......); //This line gets executed AFTER DownloadComplete() 
}; 

var DownloadComplete = function() { 
    if (xhr.readyState == 4) { 
     timeOutTimer.Abort();   //<--------timeOutTimer is null here 
     //Callstack points back to xhr.send 
    } 
} 

如果真的有可能爲XMLHttpRequest來甚至退出的send()之前調用onreadystatechange的回調 - 功能?

只有當我在本地開發服務器上瀏覽網站時纔會出現此錯誤。另外,如果我添加1sec延遲serverside沒有問題。我還沒有嘗試過任何其他瀏覽器。

我想解決方案是在發送之前啓動定時器,但我只想知道這種行爲背後的原因,以及它是否正確,因爲我從來沒有經歷過它。

+0

您是否重新初始化現有的XHR對象,或者在每次調用StartDownload時創建一個新對象?你的代碼中有沒有'alert()'調用? – 2012-03-19 02:55:06

回答

1

你說甚至在退出send()函數之前「但這不是真的。你打電話給發送,然後你正在構造一個計時器,但事情發生得如此之快,以致你甚至在計時器進入其變量之前,就會發生回調。它是異步的,就像你所要求的一樣。只需要爲此做好準備。

+0

但JavaScript本身是單線程的。異步事件只能在用戶代碼不運行時觸發。因此,StartDownload應該在任何異步事件觸發前完成,並且上述行爲的唯一方法是發送永不退出。 – user1248092 2012-03-17 20:33:37

+0

也許它取決於「跑步」的定義 - 顯然你看到令人驚訝的事情,但FF11是全新的,所以誰知道。正如你所說,如果你移動定時器的構造函數,你將會很安全。仍然感到驚訝,但安全。 – dldnh 2012-03-17 20:44:01

相關問題