我正在尝试使用开发人员自动生成的链接来调用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
异步标志),但部分行为肯定是同步的。
设置事件处理程序(onload
,onreadystatechange
等)是同步完成的。这就是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/