为什么我们在XMLHttpRequest中编写send()之前编写onload()函数

时间:2017-07-27 09:23:31

标签: javascript xmlhttprequest

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

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();

1 个答案:

答案 0 :(得分:7)

  

我不明白为什么我们在onload()函数之前编写send()函数。

因此,在发送请求之前,负载处理程序就位于,因为发送请求将导致调用处理程序(如果成功)。

  

onload()函数处理我们收到的响应,send()函数向服务器发送请求。因此,onload()必须根据我的理解在send()函数之后编写。

send(由XHR基础设施)(或可能在此期间)调用之后调用。当您将其分配给onload时,您不会调用它。您只需定义它,以便在XHR需要调用它时将其定义。

以下是发生的事情:

  1. 您创建了XHR。
  2. 您为load事件注册处理程序(在您的情况下,通过为onload分配一个函数)。
  3. 您致电send
    1. 浏览器启动(并可能完成)请求
  4. 请求完成后,如果成功,浏览器的XHR处理会触发load事件。这将查找load的任何当前注册的处理程序,并将调用队列调用(如果有)。只要主JavaScript线程可用于运行它们,就会运行这些调用。
  5. 很多时候,你会以错误的方式离开,因为当请求完成时,你会把load处理程序放在那里;但不是 总是 load是一个事件。如果可以立即满足请求(例如,从缓存中),则浏览器可以在load期间触发send,并查看是否有{{}} {在load的调用期间{1}}处理程序,如果没有,则不会将调用排入任何回调。稍后当您附加处理程序时,事件已被触发(当没有附加时)。

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