Ir para conteúdo

POWERED BY:

Arquivado

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

Vitor Luis_78306

Problema com AJAX e variáveis globais

Recommended Posts

Olá pessoal, estou com um probleminha em meu código, onde nenhuma variável externa funciona quando tento modificar seus valores dentro de um AJAX:

 

// Receive Videos
function getVideos(){
	var video = [];
	var i = 0;

	// Read XML File
	$.ajax({
		type: 		'GET',
		url: 		'videos.xml',
		dataType: 	'xml',
		success: 	function(xml){
			$(xml).find('video').each(function(){
				i++

				var client 		=	$(this).find('client').text();
				var source 		=	$(this).find('source').text();
				var dateEnd 	=	$(this).find('dateEnd').text();
				var dateStart 	=	$(this).find('dateStart').text();
				var totalViews 	=	$(this).find('totalViews').text();

				video[i] = [client, dateStart, dateEnd, totalViews, source];
			});
		}
	});

	alert(video.length);
}

 

Acredito eu que seja porque o AJAX roda antes de todo o script, seria isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

"Acredito eu que seja porque o AJAX roda antes de todo o script, seria isso?"

exatamente ao contrario.

na verdade a sua requisicao roda na mesma hora, mas a resposta do teu servidor vem depois dentro do callback, no caso acima, o success.

dá um alert no video.length logo apos o final do .each do jquery, voce vai ver o que estava esperando.

caso queira acessar os dados fora do callback, voce poderia criar uma funcao e chama-la no momento que o .each termina.

 

o javascript possui inumeras situacoes assincronas, uma delas ocorre no caso do ajax, seria como se quando o navegador estivesse lendo linha por linha, no seu caso, vc chamou $.ajax, o navegador vai executar essa linha, dai ele vai em frente e executa o alert, so que o ajax ainda não recebeu resposta alguma, por isso o length vai retornar 0.

 

ao contrario de muitas linguagens, as coisas no javascript nem sempre acontecem na ordem como voce declarou os procedimentos/comandos, isso exige que voce tenha um controle maior no que e como as coisas acontecem

Compartilhar este post


Link para o post
Compartilhar em outros sites

paulojuchem,

Muito obrigado pela informação, mas infelizmente não deu certo!

 

Deixei a variavel video acessível para todo o documento, o que já não seria muito legal de fazer, criei uma funçãozinha que apenas colocaria os dados recebidos do each dentro do array e depois tentei printar o length do array, continuou dando 0!

 

var video = new Array();

$(document).ready(function(){
	getVideos();
	print(video.length)
});

// Set Video
function setVideo(id, client, dateStart, dateEnd, totalViews, source){
	video[id] = new Array(client, dateStart, dateEnd, totalViews, source);
}

// Receive Videos
function getVideos(){
	var i = 0;

	// Read XML File
	$.ajax({
		type: 		'GET',
		url: 		'videos.xml',
		dataType: 	'xml',
		success: 	function(xml){
			$(xml).find('video').each(function(){
				i++

				var client 		=	$(this).find('Client').text();
				var source 		=	$(this).find('Source').text();
				var dateEnd 	=	$(this).find('DateEnd').text();
				var dateStart 	=	$(this).find('DateStart').text();
				var totalViews 	=	$(this).find('TotalViews').text();

				setVideo(i, client, dateStart, dateEnd, totalViews, source);
			});
		}
	});
}

 

Em resumo:

Eu só conseguirei usar o que guardar no array, dentro do AJAX? Praticamente todo meu código terá que funcionar por lá?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

eu nao testei, mas deve dar certo

 

 

"Eu só conseguirei usar o que guardar no array, dentro do AJAX? Praticamente todo meu código terá que funcionar por lá?"

 

 

 

voce nao precisa declarar tudo la dentro, voce pode declarar funcoes fora e chama-las la dentro, mas uma coisa é fato:

só la dentro voce vai ter acesso aos dados

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao ler o tutorial postado pelo William, comecei a testar a função!

Só de deixar o async como false, meu problema já se resolveu!

 

Muito obrigado, agora não é mais necessário ficar com gambiarras!

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.