我正在尝试使用Javascript / jQuery / Google Maps API编写一些代码。
但是,我脚本中的执行顺序有点奇怪。
var flats=[];
function initialize() {
var mapOptions = {
zoom: 10,
center: new google.maps.LatLng(50.062, 19.937),
mapTypeId: google.maps.MapTypeId.ROADMAP
}
var map = new google.maps.Map(document.getElementById('map-canvas'),mapOptions);
/* Puling flats data using my API */
$.getJSON("http://ks3353689.kimsufi.com:5000/v1/closest_pointlng=19.937&lat=50.062",parseFlat);
function parseFlats(data){
/* I put flats data in format usable by Google maps API */
$.each(data, function(i, item){
flat = [];
flat.push('flat_name');
flat.push(parseFloat(item.latitude));
flat.push(parseFloat(item.longitude));
// z-index to display flats on map
flat.push(i+1);
flats.push(flat);
});
console.log("I'm inside the function");
}
console.log("activating markers");
setMarkers(map, flats);
}
我认为jQuery API调用将在setMarkers函数之前执行,但是当我查看firebug时,顺序是不同的:
activating markers
I'm inside the function
我做错了什么?如何确保在setMarkers函数之前执行jQuery部分?
答案 0 :(得分:1)
执行的确切顺序是:
mapOptions
map
$.getJSON
,它发送一个AJAX请求并在收到回复时注册要调用的函数。activating markers
setMarkers()
。initialize()
函数返回到浏览器的事件循环。parseFlats()
,然后记录I'm inside the function
。请记住,AJAX中的第一个A代表异步。
答案 1 :(得分:0)
将setMarkers
移到parseFlats
的内部,即可获得所需的订单。
答案 2 :(得分:0)
您的问题是$ .getJSON的异步性质。如果你需要在parseFlats之后调用setMarkers(map,flats),请在parseFlats中调用它
$.getJSON("http://ks3353689.kimsufi.com:5000/v1/closest_pointlng=19.937&lat=50.062",parseFlat);
function parseFlats(data){
/* I put flats data in format usable by Google maps API */
$.each(data, function(i, item){
flat = [];
flat.push('flat_name');
flat.push(parseFloat(item.latitude));
flat.push(parseFloat(item.longitude));
// z-index to display flats on map
flat.push(i+1);
flats.push(flat);
});
console.log("I'm inside the function");
console.log("activating markers");
setMarkers(map, flats);
}
另一种可能性是使用$ .ajax并将asyn属性设置为false(但我不会推荐它,因为浏览器会阻止,直到收到服务器答案为止)
$.ajax({
dataType: "json",
url: 'http://ks3353689.kimsufi.com:5000/v1/closest_pointlng=19.937&lat=50.062',
success: parseFlat,
async:false
});