[英]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.