请记住,我是非常 JavaScript语法的新手,所以请耐心等待。
我试图使用多个onreadystatechange
作为承诺来捕捉我从快递中返回的内容,但每次我这样做时,都会被调用。这是我的代码:
var ready = function(){
xhr.open('GET', 'getallbeertypes');
xhr.send(null);
xhr.onreadystatechange = function () {
var parent = document.getElementById('recipes');
var docfrag = document.createDocumentFragment();
if(xhr.status == 200){
var beerTypes = JSON.parse(xhr.responseText);
//loop through beerTypes to append a button to each list item
for (var beer = 0; beer < beerTypes.length; beer++){
//create necessary elements
var li = document.createElement('li');
var button = document.createElement('BUTTON');
//set text content to list item
li.textContent = beerTypes[beer].alias;
//append list item to button
button.appendChild(li);
// add onclick attribute
button.setAttribute("name", beerTypes[beer]._id);
button.setAttribute("onclick", "moreInfo(this.getAttribute('name'))");
//append button to document fragment
docfrag.appendChild(button);
}
//display on DOM element
parent.appendChild(docfrag);
}else{
// console.log(JSON.parse(xhr.responseText));
var header = document.createElement('h1');
header.textContent = "Something went wrong. Please try again later.";
docfrag.appendChild(header);
parent.appendChild(header);
}
}
}
ready();
因此上面的代码部分工作,它将每个JSON对象显示为项目列表中的按钮。单击该按钮时,应运行以下功能:
var moreInfo = function(_id){
xhr.open('GET', '/getuserrecipes/' + _id);
xhr.send();
xhr.onreadystatechange = function(){
console.log("is this running?");
console.log(JSON.parse(xhr.responseText));
}
}
我希望onclick
属性应该只运行moreInfo
函数。
每当我单击其中一个按钮时,else
函数中的ready
语句就会以某种方式运行,并在屏幕上显示Something went wrong. Please try again later
。
我唯一能做的就是onreadystatechange
,但我真的不知道是不是。
如何/为什么其他功能甚至被调用,我该如何阻止它?感谢所有帮助。
答案 0 :(得分:2)
您应该检查请求的状态。为此,请使用readyState属性。有5个状态,从0到4的整数,你想要最后一个,即4。
类似的东西:
if (xhr.readyState == 4 && xhr.status == 200){
...
}
检查this示例。