1
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);
}

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

如何在坐标数组中获得我想要的值?

4

3 回答 3

4

这不是闭包的问题,​​而是 JavaScript AJAX 调用的异步特性。AJAX 调用响应到达的那一刻(并且您的成功函数被调用,传播coordinates数组)是在您登录该数组之后的方式 - 当时它是空的。

我猜你想以某种方式返回coordinatesfromforeignCoordinatesArray()函数。如您所见,您不能使用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()在将其用作 URL 的一部分之前转义。

于 2012-06-12T21:04:26.990 回答
2

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

在这种情况下,解决方案是将您console.log(coordinates)移至成功功能。

于 2012-06-12T21:05:14.570 回答
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);
  }

}
于 2012-06-12T21:05:05.970 回答