DWR - Abortar Requisição

13 respostas
tc_medeiros

Fala galera, como faço para abortar uma requisição que fiz com dwr antes que ela se complete?

Vlw.

13 Respostas

tc_medeiros

Alguém, por favor. :shock:

marcos1EM

tc_medeiros:
Fala galera, como faço para abortar uma requisição que fiz com dwr antes que ela se complete?

Vlw.

Qual seria a necessidade para isso?

tc_medeiros

Um autocomplete. A primeira requisição está colocando os resultados em cima da segunda, pois a primeira traz uma quantidade de dados maior e dá tempo da segunda terminar primeiro.

marcos1EM

Posta o código aí, talvez assim alguém consiga ajudar

Mero_Aprendiz

Olá…
Bem, apenas uma dica:
E se você limitasse a quantidade de resultados que devem ser mostrados? Por exemplo, 10 resultados por vez.

Assim você reduz a quantidade e o tempo da requisição.

[]'s
JL

tc_medeiros

Olá…
Bem, apenas uma dica:
E se você limitasse a quantidade de resultados que devem ser mostrados? Por exemplo, 10 resultados por vez.

Assim você reduz a quantidade e o tempo da requisição.

Você diz fazer uma paginação em um campo de autocomplete?

tc_medeiros

Segue o código:

function autocompletar(e, campo) {

	//Pega o valor keycode da tecla digitada
	var whichCode = (window.Event) ? e.which : e.keyCode;
	
	if (whichCode == 9 || whichCode == 0)//Tab
		return false;
	
	//Se clicar em seta pra baixo
	if (whichCode == 40) {
		
		//O primeiro item da caixa de sugesto  selecioado
		jQuery("#autoOpcao").find("option").filter(":first").attr("selected", "selected");
		
		//A caixa de sugesto ganha foco
		jQuery("#autoOpcao").focus();
		
		return true;
	}

	//Limpa o select
	jQuery("#autoOpcao").empty();
	
	//Se estiver vazio fecha esconde a caixa de sugesto
	if (jQuery.trim(jQuery("#" + campo).val()) == "") {
		jQuery("#autosugestao").css("display", "none");
		return;
	}
	
	//Marca o campo que est sendo usado a auto sugesto
	jQuery("#hiddenSugestao").val(campo);
	
	if (jQuery.trim(jQuery("#" + campo).val()).length > 2)
		buscaLike(campo);
}

function buscaLike(campo){
	
	//Compara os campos
	switch (campo) {
		case "partnumber":
			
			jQuery("#assistenteAutoSugestao").hide();
			
			//Busca o partnumber
			ControleMercadoria.autocompletarPartNumber(jQuery.trim(jQuery("#partnumber").val()), function(listaPartNumbers){			
				
				//Inicia a lista
				var htmlLista = "";
				
				//Lista os partnumbers
				for (var i = 0; i < listaPartNumbers.length; i++)
					htmlLista = htmlLista + "<option value='" + listaPartNumbers[i].sequencia + "'>" + listaPartNumbers[i].partNumber + "</option>";
				
				
				//Se lista for vazia esconde a caixa de auto sugesto
				if (htmlLista == ""){
					jQuery("#autosugestao").css("display", "none");
					return;
				}
				
				//Insere a lista no select
				jQuery("#autoOpcao").html(htmlLista);
				
			});
			break;
		case "exportadorBarra":
		case "fabricanteBarra":
		case "exportador":
		case "fabricante":
			
			jQuery("#assistenteAutoSugestao").empty();
			jQuery("#complAutoSugestao").empty();
			jQuery("#assistenteAutoSugestao").show();
		
			//Busca o exportador/fabricante
			ControleMercadoria.autocompletarEmpresa(jQuery.trim(jQuery("#" + campo).val()), function(listaEmpresas){			
				
				//Inicia a lista
				var htmlLista = "";
				var htmlListaCompl = "";
				
				//Lista os exportadores/fabricantes
				for (var i = 0; i < listaEmpresas.length; i++) {
					htmlLista = htmlLista + "<option value='" + listaEmpresas[i].codigo + "'>" + listaEmpresas[i].nome + " (" + 
											listaEmpresas[i].pais.descricao + ")</option>";
					
					var logradouro = "";
					var numero = "";
					var complemento = "";
					var cidade = "";
					var estado = "";
					
					if (listaEmpresas[i].logradouro != null)
						logradouro = listaEmpresas[i].logradouro;
					if (listaEmpresas[i].numero != null)
						numero = " - " + listaEmpresas[i].numero;
					if (listaEmpresas[i].complemento != null)
						complemento = " - " + listaEmpresas[i].complemento;
					if (listaEmpresas[i].cidade != null)
						cidade = " - " + listaEmpresas[i].cidade;
					if (listaEmpresas[i].estado != null)
						estado = " - " + listaEmpresas[i].estado;
						
						
					htmlListaCompl += "<span id='compl_" + listaEmpresas[i].codigo + "'><strong>" + listaEmpresas[i].nome + "</strong><br />" +
									logradouro + "" + numero + "" + complemento + "" + cidade + "" + estado + " - " + 
									listaEmpresas[i].pais.descricao + "</span>";					
				}
				
				//Se lista for vazia fecha a div
				if (htmlLista == ""){
					jQuery("#autosugestao").css("display", "none");
					return;
				}
				
				//Insere a lista no select
				jQuery("#autoOpcao").html(htmlLista);
				jQuery("#complAutoSugestao").html(htmlListaCompl);
				
			});
			break;
		
		case "ncmBarra":	
		case "ncm":
		
			jQuery("#assistenteAutoSugestao").hide();
			
			//Busca a descricao do ncm
			ControleMercadoria.autocompletarNCM(jQuery.trim(jQuery("#" + campo).val()), function(listaNCMs){			
				
				//Inicia a lista
				var htmlLista = "";
				
				//Lista os partNumbers
				for (var i = 0; i < listaNCMs.length; i++)
					htmlLista = htmlLista + "<option value='" + listaNCMs[i].codigo + "'>" + listaNCMs[i].codigo + "</option>";
				
				
				//Se lista for vazia fecha a div
				if (htmlLista == ""){
					jQuery("#autosugestao").css("display", "none");
					return;
				}
				
				//Insere a lista no select
				jQuery("#autoOpcao").html(htmlLista);
				
			});
			break;
	}
		
	
	//Busca a posio da caixa
	var origemTop = origemLeft = 0;
	var obj = document.getElementById(campo);
	if (obj.offsetParent) {
		do {
			origemLeft += obj.offsetLeft;
			origemTop += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}

	//Posiciona a caixa de auto sugesto e mostra
	jQuery("#autosugestao").css("left", origemLeft);
	jQuery("#autosugestao").css("top", origemTop + jQuery("#" + campo).height() + 5);
	jQuery("#autosugestao").css("display", "block");
	
}
Mero_Aprendiz

tc_medeiros:
Olá…
Bem, apenas uma dica:
E se você limitasse a quantidade de resultados que devem ser mostrados? Por exemplo, 10 resultados por vez.

Assim você reduz a quantidade e o tempo da requisição.

Você diz fazer uma paginação em um campo de autocomplete?

Olá…
Não é fazer paginação do altocomplete, mas sim reduzir o número de itens que serão listados.
Por exemplo:
Se um resultado trazer 20.000 resultados. Essa quantidade de dados para o usuário não é muito útil além de ser muito pesado.
A minha dica é para trazer uma quantidade reduzida de dados.
Uma outra dica é começar a fazer a paginação depois que o usuário começar a digitar uma quantidade minima de letras.
Ficou claro?

[]'s
JL

tc_medeiros

Olá…
Não é fazer paginação do altocomplete, mas sim reduzir o número de itens que serão listados.
Por exemplo:
Se um resultado trazer 20.000 resultados. Essa quantidade de dados para o usuário não é muito útil além de ser muito pesado.
A minha dica é para trazer uma quantidade reduzida de dados.
Uma outra dica é começar a fazer a paginação depois que o usuário começar a digitar uma quantidade minima de letras.
Ficou claro?

Sim amigo, entendi, mas no meu caso, fazer essa redução não é o ideal. Hoje eu faço como você disse, uso uma quantidade mínima de letras. o qual tb não é o ideal. Mas obrigado pela idéia.

marcos1EM

Eu iria te sugerir o que foi dito pelo Mero_Aprendiz, mas como isso vc ja esta fazendo, uma outra sugestão é disabilitar o campo de busca quando uma requisição for iniciada e só habilita-lo novamente quando obter o resultado da requisição feita, é a única soluçao que consigo ver para o seu caso, já que até onde conheço n seria possível cancelar uma requisição feita, ja que a requisição ja pode ter sido passada para o banco de dados e tal.

arthurminarini

ja tentou enfileirar por callback? desta forma apenas quando a primeira requisição voltar que será desparada a segunda.

desabilite o async do dwr retorne o resultado e depois faça outras buscas e no final de tudo volte a habilitar o async

tc_medeiros

Sim, amigo, já fiz isso, fica lento por demais.

arthurminarini

então é fazer o que os caras falaram mesmo. enxugar no máximo a consulta de retorno tipo um Top 5 ou Limit 5 etc…

Criado 15 de setembro de 2010
Ultima resposta 22 de set. de 2010
Respostas 13
Participantes 4