2014-01-31 30 views
1

在下面的代碼段js的在這個JavaScript中是否有競爭條件?

request = new XMLHttpRequest 
request.open('GET', '/my/url', true) 
request.send() 

request.onload = function() { 
    data = JSON.parse(this.response) 
} 

應的負載的分配是在send()之前,以避免競態條件。或者瀏覽器爲你處理它(當你開始分配它時,通過開啓負載)。

+1

JavaScript基本上是單線程的,所以沒有,沒有競爭條件。 –

+1

@PatrickEvans我敢肯定,瀏覽器不會啓動請求,直到瀏覽器的線程空閒。但我不確定這是否是特定的行爲。我想有些瀏覽器可能會以不同的方式實現。 –

+1

在open()和send()調用之前放置事件處理程序至少被認爲是一種很好的做法,以確保它不是問題,即使競爭條件的可能性很小,也很容易確保你避免它。 – adeneo

回答

1

你的請求應該更像:

var request = new XMLHttpRequest || new ActiveXObject('Microsoft.XMLHTTP'); 
request.open('GET', '/my/url'); 
request.onreadystatechange = function(){ 
    if(request.readyState == 4 && request.status == 200){ 
    console.log(request.responseText); 
    } 
} 
request.send(); 

爲了進一步回答你的問題request.send()應該發生。最後,因爲如果響應返回前的功能分配到request.onreadystatechange,有可能是一個問題,雖然它的不太可能,這種反應會很快。

+1

我在大多數JavaScript實現中都很漂亮,它只是*不可能*在事件被綁定之前得到響應,因爲只有在沒有任何事件可以運行時纔會觸發事件。另外,自從IE8 +以後,我認爲'ActiveXObject'的攻擊是不必要的。也許更早。 – mpen

+0

當'readyState'改變時,分配給'request.onreadystatechange'的函數被觸發。 'request.send()',只是發送你的url信息到服務器,因爲這是一個''GET''請求。 – PHPglue

+0

我不知道如果這與我剛剛說的有什麼關係,或者onreadystatechange + readystate == 4與request.onload不同。在readyState更改後,onload立即被觸發。 http://jsfiddle.net/mnbayazit/DJY5G/4/ – mpen