从回调函数中获取变量

时间:2012-06-12 21:01:38

标签: javascript ajax callback closures

function foreignCoordinatesArray(){

  var coordinates = [];
  $.getJSON('/critics.json?travel_id=' + $('#foreign_travel').val(), success);

  function success(ary) {
    for(var a in ary){
      var obj = ary[a];
      coordinates.push(new google.maps.LatLng(obj.latitude, obj.longitude));
    }

  }
  console.log(coordinates);
}

最后坐标仍为[]而不是[{...},{...},...]。 我想这肯定是闭包的问题

如何在坐标数组中获得所需的值?

3 个答案:

答案 0 :(得分:4)

这不是闭包的问题,​​而是JavaScript AJAX调用的异步性质。当AJAX调用响应到来时(并调用您的成功函数,传播coordinates数组),这是在您登录该数组后的方式 - 当时为空。

我想你想以某种方式从coordinates函数返回foreignCoordinatesArray()。如您所见,您无法使用return

function foreignCoordinatesArray(){
  var coordinates = [];
  $.getJSON('/critics.json?travel_id=' + $('#foreign_travel').val(), success);

  function success(ary) {
    //...
  }
  return coordinates;
}

相反,您应该传递一个将收到coordinates的回调函数:

function foreignCoordinatesArray(coordinatesCallback){
  var coordinates = [];
  $.getJSON('/critics.json?travel_id=' + $('#foreign_travel').val(), success);

  function success(ary) {
    //...
    coordinatesCallback(coordinates);
  }
}

顺便说一句,你应该在将$('#foreign_travel').val()作为网址的一部分使用之前将其转义。{/ p>

答案 1 :(得分:2)

问题不在于“闭包”本身,而在于异步编程。在获取JSON之前,不会调用success函数,这在您的foreignCoordinatesArray()函数返回后几乎总是很长。通常,当您使用像$.getJSON()之类的异步函数时,回调之外的任何代码都不应该假设回调已经运行,因为这通常不是一个安全的假设。

在这种情况下,解决方案是将console.log(coordinates)移动到成功函数中。

答案 2 :(得分:1)

执行console.log()后发生回调。如果将console.log()移动到回调函数中,则应获得预期的输出。

function foreignCoordinatesArray(){

  var coordinates = [];
  $.getJSON('/critics.json?travel_id=' + $('#foreign_travel').val(), success);

  function success(ary) {
    for(var a in ary){
      var obj = ary[a];
      coordinates.push(new google.maps.LatLng(obj.latitude, obj.longitude));
    }
    console.log(coordinates);
  }

}