2017-07-27 25 views
0

我是XMLHttpRequest的新手。我不明白为什么我们在send()函数之前编写onload()函数。 onload()函数处理响应,我们接收和发送()函数向服务器发送请求。所以onload()必须按照我的理解写在send()函数之后。有人可以帮助理解这一点。为什么我们在编写XMLHttpRequest的send()之前编写onload()函数

var xmlhttp = new XMLHttpRequest(), 
    method = 'GET', 
    url = 'https://developer.mozilla.org/'; 

xmlhttp.open(method, url, true); 
xmlhttp.onload = function() { 
    // Do something with the retrieved data 
}; 
xmlhttp.send(); 
+0

您正在声明onload函数,而不是调用它。您可以考虑阅读更多关于JavaScript功能的文章,https://www.w3schools.com/js/js_functions.asp – MikNiller

回答

3

我不明白为什么我们之前send()功能写onload()功能。

使负载处理到位之前发送的请求,因为发送请求,将导致调用处理器(如果成功的话)。

onload()函数处理我们收到的响应和send()函数向服务器发送请求。所以onload()必须按照我的理解写在send()函数之后。

这是称为send后调用(由XHR基础设施)(或潜在的期间)。当你将它分配到onload时,你不是它叫它。您只需定义它,以便在XHR需要调用时它就在那里。

这里发生了什么:

  1. 您创建XHR。
  2. 您为其load事件注册处理程序(在您的情况下,通过为onload分配函数)。
  3. 您致电send
    1. 浏览器启动(可能完成)请求
  4. 当请求完成后,如果成功,浏览器的XHR处理触发load事件。这为load查找任何当前注册的处理程序,并将这些处理程序的调用排队(如果有的话)。只要主JavaScript线程可用于运行这些调用,就会运行这些调用。

很多时候,你会以错误的方式逃避,因为当请求完成时,你会在那里放置load处理程序;但不是总是load是一个事件。如果请求可以立即满足(例如,从高速缓存),浏览器可能load期间send,并看看是否在有任何load处理器调用send,如果没有,不将呼叫排队到任何回调。稍后当你附加一个处理程序时,该事件已经被触发(当没有附加任何事件时)。

所以你必须在调用send之前附加处理程序。

+0

@ T.J. Crowder:所以我可以在onload()之前写入send()。它会导致我的应用程序出现任何问题。 – user2613946

+0

@ user2613946:我不知道我原来的答案在哪里,你认为你读到了。希望更新后的答案更清晰:不,在*调用send之后,不能可靠地连接你的'load'处理器*。 –

+1

@ T.J. Crowder:很好的解释。非常感谢!!! – user2613946

相关问题