jQuery异步ajax查询和返回值问题(范围、结束)
由于异步查询和变量范围问题,代码无法工作。我不明白怎么解决这个问题。使用async:false更改为$.ajax方法-不是选项。我知道闭包,但我如何在这里实现它——我不知道。我在这里看到了关于js和jQuery异步问题中闭包的所有主题,但仍然没有看到任何内容。请帮忙。 代码如下:jQuery异步ajax查询和返回值问题(范围、结束),jquery,ajax,scope,closures,Jquery,Ajax,Scope,Closures,由于异步查询和变量范围问题,代码无法工作。我不明白怎么解决这个问题。使用async:false更改为$.ajax方法-不是选项。我知道闭包,但我如何在这里实现它——我不知道。我在这里看到了关于js和jQuery异步问题中闭包的所有主题,但仍然没有看到任何内容。请帮忙。 代码如下: var map = null; var marker; var cluster = null; function refreshMap() { var markers = []; var mar
var map = null;
var marker;
var cluster = null;
function refreshMap()
{
var markers = [];
var markerImage = new google.maps.MarkerImage('/images/image-1_32_t.png', new google.maps.Size(32, 32));
$.get('/get_users.php',{},function(data){
if(data.status == 'error')
return false;
var users = data.users; // here users.length = 1 - this is ok;
for(var i in users)
{
//here I have every values from users - ok
var latLng = new google.maps.LatLng(users[i].lat, users[i].lng);
var mark = new google.maps.Marker({
position: latLng,
icon: markerImage
});
markers.push(mark);
alert(markers.length); // length 1
}
},'json');
alert(markers.length); // length 0
//if I have alert() above - I get result
cluster = new MarkerClusterer(map, markers,
{
maxZoom: null,
gridSize: null
});
}
谢谢。所有必须处理
标记的代码都必须在回调函数中。这行代码:
alert(markers.length); // length 0
在Ajax调用返回之前执行(即在执行回调之前)
这意味着您的代码应该更像这样:
$.get('/get_users.php',{},function(data){
if(data.status == 'error')
return false;
var users = data.users; // here users.length = 1 - this is ok;
for(var i in users)
{
//here I have every values from users - ok
var latLng = new google.maps.LatLng(users[i].lat, users[i].lng);
var mark = new google.maps.Marker({
position: latLng,
icon: markerImage
});
markers.push(mark);
alert(markers.length); // length 1
cluster = new MarkerClusterer(map, markers,
{
maxZoom: null,
gridSize: null
});
// more with cluster here
}
},'json');
如果在Ajax回调中设置或更改变量,不要依赖回调之外的变量值。只需移动以下代码:
cluster = new MarkerClusterer(map, markers,
{
maxZoom: null,
gridSize: null
});
进入回调函数(第一个警报所在的位置)
问题是,对于异步请求,即使请求尚未完成,代码仍将继续执行。因此,在执行匿名回调函数之前,标记
变量设置不正确。有什么问题?您想要/期望什么行为?看,但是如果我需要从$.get(..)范围推送var标记中的一些数据呢?那么您需要将该变量移动到比您需要引用它的范围更高的范围。