我正在尝试使用开发人员自动生成的链接来调用API。我正在根据https://javascript.info/xmlhttprequest上的教程使用XMLHttpRequest.open()方法。但是,当我尝试拨打电话时,我唯一能达到的状态是“ 0”,我认为这意味着我的努力(?)。

我尝试了与其他API的不同链接,包括那些除普通链接之外不需要任何东西的链接,并且得到了相同的响应,这意味着它不一定与我想要的API以及其他解决方案(例如$ .JSON()。done())都不合作。

我的最小代码:

<button onclick="getEndDate()">Click Me</button>

<script>
  function getEndDate() {
  alert("in function");
  // create request
  var request = new XMLHttpRequest()
  alert("request made");
  // request data from API (API link automatically generated)
request.open('GET', 'https://holidayapi.com/v1/holidays?key=validkey&country=US&year=2018&pretty', true)
  alert("request opened"+ request.status);
  // send request (?)
  request.send()
  alert("request sent");
request.onload = function() {
  alert("request loaded");
  var data = JSON.parse(this.response)
  // If we receive a valid code
  if (request.status >= 200 && request.status < 400) {
    data.forEach(holiday => {
      alert(holiday.name, holiday.date);
    })
  } else {
    alert('error');
  }
  }
}
</script>


我希望至少能够运行所有警报,但是我只能进入“请求发送”状态,这意味着加载请求结果存在问题。如前所述,在状态中,我期望200而不是0。

我是否完全以错误的方式来处理?如果是这样,我应该尝试哪种方式调用API?

最佳答案

XMLHttpRequest的send()方法的行为有点同步。它的部分行为可能是异步的(也可能不是异步的)(取决于.open()'s异步标志),但部分行为肯定是同步的。

设置事件处理程序(onloadonreadystatechange等)是同步完成的。这就是Internet Explorer的实现方式,并且自从Microsoft发明XMLHttpRequest以来,规范就要求实现它。

具体来说,step 5 of the spec for .send()要求它:


  
  如果在关联的XMLHttpRequestUpload对象上注册了一个或多个事件侦听器,则设置上载侦听器标志。
  


因此,设置事件监听器是在.send()函数返回之前完成的,而不是在从网络接收到响应时完成的。

因此,在您的代码中,您可以:

request.send(); // send will now check if it has .onload registered and
                // set up appropriate event listeners.

request.onload = function() { /* ... */ } // too late, this is ignored


在调用.onload之前,您需要通过.onreadystatechange.addEventListener('load', ...)等或通过.send()设置任何事件侦听器。

请注意,在所有使用XMLHttpRequest的官方示例中(whatwg规范,MDN,MSDN等),事件处理程序总是在.open()之前设置的,因此即使技术上规范允许您在,但在.open()之前:

request.onload = function() { /* ... */ }
request.open('GET', url, true);
request.send();


过去有(我不知道当前是否存在)某些浏览器版本允许您在.send()之后设置事件处理程序,因为它们使用标准EventEmitters而不是遵循规范。但是,即使感觉正确,这些实现在技术上也不符合该标准。

关于javascript - 当内容明显正确时,如何修复返回代码0的XMLHttpRequest.open()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57652355/

10-13 00:17