javascript对象使用'这个'

时间:2016-06-11 09:13:04

标签: javascript object

我的部分代码

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()

3 个答案:

答案 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 = thisxhr.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。

也不是说它“被检索”而不是“重新获得”。