Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rafael cardoso developer

Transformar uma função assíncrona em síncrona

Recommended Posts

Olá amigos.

Após dois dias procurando a solução desse problema na web e fazendo vários testes, estou apelando ao fórum.

É o seguinte, estou utilizando a API do google maps para fazer a geocodificação da latitude e longitude de um lugar. Funciona assim, eu entro com o nome do bairro, estado, cidade ou país e envio para o google, lá é feito o cálculo e é retornada a latitude e longitude, após isto eu adiciono um marcador no lugar que foi informado.

Até aqui tudo bem, o problema está na sincronia que o meu código está funcionando, todo este processo de geocodificação está dentro de um laço de repetição for(), dentro deste laço existe um alert que mostra a latitude e longitude, depois deste laço existe um alert que avisa que o for terminou. O problema está aqui, o navegador deixa os comandos que estão dentro do for "pendentes" e continua a execução do código, só quando o google me retorna a informação, ai é que o navegador executa aquele alert que ficou pendente e mostra a latitude e longitude.

 

Eu preciso que o algoritmo aguarde o retorno do google, execute o que tem dentro do for e só depois de exibir todos os alerts de latitude e longitude, ai sim ele pode exibir o alert dizendo que o for terminou (como um algoritmo comum faz).

 

Segue o código HTML + JS

 

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="http://www.godf.org/js/lib/Fluster2.packed.js"></script>
<script type="text/javascript">

function initialize() {
var geocoder;
geocoder = new google.maps.Geocoder();

// Create a new map with some default settings
   var myLatlng = new google.maps.LatLng(25,25);
   var myOptions = {
     zoom: 3,
     center: myLatlng,
     mapTypeId: google.maps.MapTypeId.ROADMAP
   }
   var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

// Initialize Fluster and give it a existing map
var fluster = new Fluster2(map);


var cidades=new Array();


cidades[0]="Porto Alegre";cidades[1]="Santa Teresa - Rio de Janeiro";cidades[2]="Trindade-Go";cidades[3]="Brasil";cidades[4]="João Pessoa, Paraíba, Brasil";

for(i=0;i<cidades.length;i++){
	var address = cidades[i];
	geocoder.geocode( { 'address': address}, function(results, status) {
	  if (status == google.maps.GeocoderStatus.OK) {
		map.setCenter(results[0].geometry.location);
		var marker = new google.maps.Marker({
			map: map, position: results[0].geometry.location, title: 'bla bla Marker '
		});


		coordenadas = results[0].geometry.location.toString();
		coordenadas = coordenadas.slice(1);
		coordenadas = coordenadas.slice(0,-1);
		coordenadas = coordenadas.split(', ');
		latitude = Number(coordenadas[0]);
		longitude = Number(coordenadas[1]);
		alert(latitude+", "+longitude);



	  } else {
		alert('Geocode was not successful for the following reason: ' + status);
	  }
	});
}

alert("O for terminou, esse alert DEVERIA aparecer por ultimo");

}

</script>

</head>
<body onload="initialize()">
<div id="map_canvas" style="width: 600px; height: 400px"></div>
</body>
</html>

 

Bom pessoal meu problema é este, se alguém puder me ajudar eu agradeço MUITO, porque isso já está me dando muita dor de cabeça.

Abraços, e obrigado desde já. :natalbiggrin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

se for possível alterar de assincrono para sincrono, deve ter lá no manual da API.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.