繁体   English   中英

从回调函数获取变量

[英]Get variable from callback function

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

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

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

闭包不是问题,而是JavaScript AJAX调用的异步特性。 当AJAX调用响应到达时(调用成功函数,传播coordinates数组),就在您登录该数组之后(当时为空)。

我猜您想以某种方式从foreignCoordinatesArray()函数返回coordinates 如您所见,您不能使用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);
  }
}

顺便说一句,在将其用作URL的一部分之前,应转义$('#foreign_travel').val()

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

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

执行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);
  }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM