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);
}
最后坐标仍为[]而不是[{...},{...},...]。 我想这肯定是闭包的问题
如何在坐标数组中获得所需的值?
答案 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);
}
}