在下面的代碼段js的在這個JavaScript中是否有競爭條件?
request = new XMLHttpRequest
request.open('GET', '/my/url', true)
request.send()
request.onload = function() {
data = JSON.parse(this.response)
}
應的負載的分配是在send()之前,以避免競態條件。或者瀏覽器爲你處理它(當你開始分配它時,通過開啓負載)。
在下面的代碼段js的在這個JavaScript中是否有競爭條件?
request = new XMLHttpRequest
request.open('GET', '/my/url', true)
request.send()
request.onload = function() {
data = JSON.parse(this.response)
}
應的負載的分配是在send()之前,以避免競態條件。或者瀏覽器爲你處理它(當你開始分配它時,通過開啓負載)。
你的請求應該更像:
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
,有可能是一個問題,雖然它的不太可能,這種反應會很快。
我在大多數JavaScript實現中都很漂亮,它只是*不可能*在事件被綁定之前得到響應,因爲只有在沒有任何事件可以運行時纔會觸發事件。另外,自從IE8 +以後,我認爲'ActiveXObject'的攻擊是不必要的。也許更早。 – mpen
當'readyState'改變時,分配給'request.onreadystatechange'的函數被觸發。 'request.send()',只是發送你的url信息到服務器,因爲這是一個''GET''請求。 – PHPglue
我不知道如果這與我剛剛說的有什麼關係,或者onreadystatechange + readystate == 4與request.onload不同。在readyState更改後,onload立即被觸發。 http://jsfiddle.net/mnbayazit/DJY5G/4/ – mpen
JavaScript基本上是單線程的,所以沒有,沒有競爭條件。 –
@PatrickEvans我敢肯定,瀏覽器不會啓動請求,直到瀏覽器的線程空閒。但我不確定這是否是特定的行爲。我想有些瀏覽器可能會以不同的方式實現。 –
在open()和send()調用之前放置事件處理程序至少被認爲是一種很好的做法,以確保它不是問題,即使競爭條件的可能性很小,也很容易確保你避免它。 – adeneo