变得全球化。 ajax函数内的变量

时间:2016-06-05 10:36:10

标签: javascript ajax

结果未定义为什么?如何解决这个问题呢。赋值变量,我需要在

之前使用该变量
<script type="text/javascript">
    function getAdvanceAmount (element, callback) {
  if (element === '' || !window.XMLHttpRequest) return

  var xhr = new XMLHttpRequest()
  xhr.onreadystatechange = function () {
    if (xhr.status === 200 && xhr.readyState === 4) {
      callback(xhr.responseText)
    }
  }
  xhr.open('GET', 'get_advance_amount.php?q=' + element, true)
  xhr.send()
    }

function get_value()
{
    getAdvanceAmount('1',function (karat) {
        console.log(karat)
        k1=karat;
    })
    alert(k1);
}
</script>
<button onclick="get_value()">Click</button>

3 个答案:

答案 0 :(得分:0)

这里的问题是XMLHttpRequest是异步请求,所以需要一段时间才能完成,并调用你的回调函数。

另一方面,您在alert事件触发后立即致电click,因此尚未触发回调,并将karat分配给k1变量。

getAdvanceAmount('1',function (karat) {
    console.log(karat)
    useKaratValue(karat);
})

function useKaratValue(karat) {
    // Make use of the value here...
}

这将解决问题,并在获得karat值后发出警报。

答案 1 :(得分:0)

如果按照以下方式更改,它会正常工作:

您的密码:

function get_value()
{
    getAdvanceAmount('1',function (karat) {
        console.log(karat)
        k1=karat;
    })
    alert(k1);
}

按如下方式更改:

function get_value()
{
    getAdvanceAmount('1',function (karat) {
        console.log(karat)
        alert(karat);
    })
}

由于这是异步调用,因此警报代码也应该在回调函数中。

为了更好的交叉浏览器兼容性,不仅可以使用IE6 / 7,而且还可以覆盖某些特定于浏览器的内存泄漏或错误,并且还可以通过触发ajaxical请求来减少冗长,可以使用jQuery。

$.get('get_advance_amount.php?q=' + element, function(responseText) {
    alert(responseText);
});

希望这会对你有所帮助。

答案 2 :(得分:0)

您正在调用getAdvanceAmount函数并向其传递一些参数,即一个元素和一个名为callback的函数。 getAdvanceAmount发送一个AJAX请求,当收到响应时,执行callbackcallback k1内部已初始化。

执行getAdvanceAmount后,尝试使用k1,但是不成功。原因是callback在尝试使用k1的值时尚未执行。这就是:

  • getAdvanceAmount被称为
  • 发送AJAX请求
  • k1尝试使用的值
  • 服务器收到请求
  • 服务器解析请求
  • 服务器发送响应
  • 浏览器收到回复
  • 浏览器调用初始化callback
  • k1

您只是在初始化之前尝试按时间顺序使用k1的值,因为错误的假设是在调用getAdvanceAmount之后使用它,它负责初始化保证它将被初始化,显然不是这样。尝试在k1中使用callback,您会看到它已正确初始化。