此javascript中是否存在竞争条件?

此javascript中是否存在竞争条件?,javascript,multithreading,concurrency,Javascript,Multithreading,Concurrency,在下面的js代码段中 request = new XMLHttpRequest request.open('GET', '/my/url', true) request.send() request.onload = function() { data = JSON.parse(this.response) } 加载时的赋值应该在send()之前,以避免竞争条件。或者浏览器是否为您处理该请求(当您有时间分配它时,通过启动加载)。您的请求应该更像: var request = new XM

在下面的js代码段中

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基本上是单线程的,因此,不存在争用条件。@PatrickEvans我很确定浏览器在线程空闲之前不会启动请求。但我不确定这是否是特定的行为。我想有些浏览器可能会以不同的方式实现这一点。至少将事件处理程序放在
open()
send()
调用之前是一种良好的做法,以确保这不是一个问题,即使竞争条件的可能性很小,也很容易确保避免它。不应该使用onload。使用
onreadystatechange
,测试
request.readyState==4&&request.status==200
。在大多数JavaScript实现中,我非常喜欢在事件绑定之前返回响应,因为只有在没有任何东西可以运行的情况下才会触发事件。另外,我认为自从IE8+以来,
ActiveXObject
hack是不必要的;可能更早。分配给
request.onreadystatechange
的函数在
readyState
更改时被激发
request.send()
,只是将您的url信息发送到服务器,因为这是一个
'GET'
请求。我不确定这与我刚才说的有什么关系,或者onreadystatechange+readystate==4与request.onload有什么不同。在readyState更改后立即触发onload
onload
不是
XMLHttpRequest
s的标准。想想渐进式增强。