我正在请求从表老师那里获取名称并且我收到的响应很好,但是下面代码中的Teachers数组无法从显示Teachers.length = 0的其他函数访问。这是由于某种延迟处理XML请求,请解释一下,谢谢。
document.onreadystatechange = function () {
if (document.readyState === "complete") { // PAGE HAS BEEN LOADED
Teachers = [];
var object = [];
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (request.readyState === XMLHttpRequest.DONE) {
if (request.status === 200) {
object = JSON.parse(request.responseText);
for(var i = 0 ; i < object.length; i++){
Teachers.push(object[i].name.toString());
console.log("*" + Teachers.length);
}
}
console.log(Teachers.length);
}
};
request.open('GET', 'http://localhost:3000/names', true);
request.send(null);
CreateRow();
for(var i = 0; i < absentTeachers.length; i++){
PrepareRow(i, "row"+(i+1));
}
}}
像CreateRow这样的函数正在使用教师,但是它显示为空,但是当我在请求处理函数中记录教师长度时,它会显示更改。
答案 0 :(得分:2)
您的代码遇到了问题,因为您期望同步功能。但是,Ajax请求是异步处理的。
通常情况下,JS从代码顶部开始,然后运行到底部。这是您习惯的功能。如果您的请求将同步处理,您的代码将毫无问题地工作。但是:Javascript从顶部开始,获取请求,将其发送出去并继续执行其余代码。此时,您的Teachers
数组仍为空,因此不会发生任何事情。
您需要做的是等到请求完成并且数据可用。 (您可能会注意到,在获取填充数组的日志之前,具有空数组的console.log
发生了。
这种情况发生的原因是,一旦您的请求到达该点,您就会调用console.log
。 (再次,请求内部从上到下)。因此,要解决您的问题,请创建一个函数,然后在Ajax请求中调用该函数。
document.onreadystatechange = function () {
if (document.readyState === "complete") { // PAGE HAS BEEN LOADED
Teachers = [];
var object = [];
function createRow() {
for(var i = 0; i < absentTeachers.length; i++){
PrepareRow(i, "row"+(i+1));
}
}
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (request.readyState === XMLHttpRequest.DONE) {
if (request.status === 200) {
object = JSON.parse(request.responseText);
for(var i = 0 ; i < object.length; i++){
Teachers.push(object[i].name.toString());
console.log("*" + Teachers.length);
}
}
createRow();
}
};
request.open('GET', 'http://localhost:3000/names', true);
request.send(null);
}}
我希望这能解决你的问题。