我的部分代码
INSERT INTO dbo.Pattern(PatternResult)
SELECT cast(n.NumberID AS VARCHAR (5)) + ' - ' + cast(nn.NumberID AS VARCHAR (5)) AS PatternResult
FROM dbo.Number n
CROSS JOIN dbo.Number nn
当我运行函数u()时,第一个console.log工作但是seconde一个不起作用,第二个只返回1234。我在按钮onclick事件中使用函数u()
答案 0 :(得分:1)
这是因为,您正在发送异步AJAX请求,默认情况下,所有ajax请求都是异步的。异步请求不会等待响应,它会发送AJAX请求并继续它的调用(这确实是一个功能),因为同时服务器正在响应,你可以在javascript上执行其他代码
所以执行的实际顺序是 function getData() - >发送请求 - > function setData() - > console.log(" second") - >收到回复 - >的console.log("第一&#34)
您可以尝试以下代码,并告诉我它是否能解决您的问题
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();
}
答案 1 :(得分:0)
要保留“此”范围,您应该在定义this
之前保存对var _this = this
(xhr.onreadystatechange = ...
)的引用,并将其用于回调而不是this
答案 2 :(得分:0)
这种行为是由以下事实引起的:回调中的this
不指向对象,而是指向window
。基本上,您设置的是window.retrivedData
而不是对象的retrievedData
。要解决该问题,您有以下选择:
1)使用以下命令将正确的this
绑定到回调:
xhr.onreadystatechange = function() {
// [...]
}.bind(this)
2)使用:
手动设置this
var self = this;
xhr.onreadystatechange = function() {
// here do not use "this" but "self" instead
}
3)使用ES6的胖箭符号:
xhr.onreadystatechange = () => {
// [...]
}
但请注意,大多数浏览器都没有(完全)支持ES6。您需要转换代码,例如,使用Babel。
也不是说它“被检索”而不是“重新获得”。