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

これはクロージャの問題ではありませんが、JavaScriptAJAX呼び出しの非同期性に問題があります。AJAXコールレスポンスが到着した瞬間(そして成功関数が呼び出され、coordinates配列を伝播します)は、その配列にログインした後の方法です-その時点では空でした。

coordinatesどういうわけかfromforeignCoordinatesArray()関数を返したいと思います。ご覧のとおり、使用することはできません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

問題は「クロージャー」自体ではなく、非同期プログラミングにあります。foreignCoordinatesArray()成功関数は、JSONがフェッチされるまで呼び出されません。これは、関数が戻ってからほとんどの場合、長くなります。一般に、のような非同期関数を使用している場合$.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 に答える