Javascript 使用';这';
我代码的一部分Javascript 使用';这';,javascript,object,Javascript,Object,我代码的一部分 var tablo = { tablo_id: 0, retrivedData: 1234, getData: function() { var xhr; var data = "aranan=" + document.getElementById('aranan').value; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest();
var tablo = {
tablo_id: 0,
retrivedData: 1234,
getData: function() {
var xhr;
var data = "aranan=" + document.getElementById('aranan').value;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else if (window.ActiveXObject) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
this.retrivedData = JSON.parse(xhr.responseText);
console.log(this.retrivedData); //first
}
}
xhr.open("POST", "listele.php", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(data);
},
setData: function() {
console.log(this.retrivedData); //Second
}
}
}
function u() {
tablo.getData();
tablo.setData();
}
当我运行函数u()时,first console.log work但seconde one不起作用,second只返回1234。我使用button onclick event中的函数u()来保留“this”范围,在定义
xhr.onreadystatechange=…
之前,您应该保存对this
(var\u this=this
)的引用,并将其用于回调,而不是this
,该行为是由事实引起的,回调中的此
不指向对象,而是指向窗口
。因此,本质上,您设置的是window.retrievedData
,而不是对象的retrievedData
。要解决该问题,您有以下选项:
1) 使用以下方法将正确的此绑定到回调:
xhr.onreadystatechange = function() {
// [...]
}.bind(this)
var self = this;
xhr.onreadystatechange = function() {
// here do not use "this" but "self" instead
}
2) 使用以下方法手动设置此
:
xhr.onreadystatechange = function() {
// [...]
}.bind(this)
var self = this;
xhr.onreadystatechange = function() {
// here do not use "this" but "self" instead
}
3) 使用ES6的胖箭头表示法:
xhr.onreadystatechange = () => {
// [...]
}
但是请注意,大多数浏览器还不(完全)支持ES6。例如,您需要使用Babel传输代码
也不是说它是“检索”而不是“检索”的。这是因为,您正在发送异步AJAX请求,在javascript中,默认情况下,所有AJAX请求都是异步的。异步请求不会等待响应,它将发送AJAX请求并继续调用(这确实是一个特性),因为在服务器响应的同时,您可以在javascript上执行其他代码
所以你们的实际执行顺序是
函数getData()->发送请求->函数setData()->控制台.log(“第二个”)->接收响应->控制台.log(“第一个”)
您可以尝试下面的代码,让我知道它是否解决了您的问题
var tablo = {
tablo_id: 0,
retrivedData: 1234,
getData: function() {
var xhr;
var data = "aranan=" + document.getElementById('aranan').value;
var that = this;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else if (window.ActiveXObject) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
that.retrivedData = JSON.parse(xhr.responseText);
console.log("First :",that.retrivedData); //first
that.setData();
}
}
xhr.open("POST", "listele.php", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(data);
},
setData: function() {
console.log("Second :",this.retrivedData); //Second
},
}
}
function u() {
tablo.getData();
//tablo.setData();
}
您需要定义“工作”和“不工作”的含义。提供预期输出和实际输出,以及任何错误消息(如果有)。那么如何更改此设置situation@GungorCelik:这取决于你想要实现什么,你能更清楚地回答你的问题吗,然后我可以帮助你们…我只是将数据从getData函数传输到SetData函数,该函数有填充表格单元格的代码loop@GungorCelik:好的,那么您需要在收到响应后调用该函数,所以在readystate更改时,您可以调用回调函数。我理解,但我不知道如何执行该操作