Ajax urgente!

11 respostas
R

Amigos estou com uma dúvida!!

No ajax teria como eu fazer da seguinte maneira…

Ao fazer uma requisição via ajax ao meu servidor ele demora um determinado tempo pra me responder… isso é normal… mas neste intervalo de tempo que ele leva pra responder a requisição eu preciso fazer com que o meu fluxo de lógica fique aguardando a resposta desta requisição… após receber o resposta do servidor… o fluxo continuaria normalmente…

Se não fui claro ou não entenderam minha pergunta favor pedir maiores detalhes…

Muito obrigado por lerem…

Att. Roberto

11 Respostas

C

Não sei se entendi a dúvida direito, mas vamos lá: o conceito de chamada assíncrona carrega junto a necessidade de definirmos um callback, uma rotina que irá processar o retorno da chamada.

Você não precisa, então, ficar com a execução do código “travada” em um ponto, aguardando retorno. Se a chamada ao AJAX for a última da sua rotina, o próximo código processado será a da rotina de callback.

Nesse meio-tempo, você pode simular ao usuário o “travamento” das operações - trocar o ponteiro por uma ampulheta, desabilitar botões de execução, etc. Isso depende de sua interface, e se foi identificada a necessidade de fazê-lo ou não…

Resumindo, seu fluxo irá esperar pela execução, só que não comendo ciclos da CPU, mas sim pelo fato de ter sido indicado um método a ser chamado ao fim do processamento no servidor…

Respondi?

R

Acho que não fui bem compreendido… entendo a mesma coisa… é uma requisão assincrona certo!!!

Mas eu gostaria de travar a rotina e esperar o “callback” para seguir o processo normal… tipo…

function teste(){

chamarAjax();

Gravar();

}

Gostaria de executar o Gravar após o retorno do meu chamarAjax();
Porque como é uma requisição assincrona o Gravar não espera a resposta do chamarAjax()…

Será q estou errado ou é assim…

C

É assim mesmo, mas você não entendeu o ponto onde pode “quebrar” sua execução.
Usando seu exemplo, ficaria assim:

function teste(){
  chamarAjax("retornoTeste", parametros);
}

function retornoTeste() {
  Gravar() {
}

Estou passando no chamarAjax o nome da rotina que deve tratar o retorno desse, ou então, simplesmente retomar o fluxo de execução.

Desse jeito, estamos usando uma estrutura assíncrona pra trabalhar de forma síncrona - seu código não vai pra frente enquanto não receber o retorno do Ajax.

Cheers!

R

Isso mesmo que quero amigo… agora só não entedi como utilizar isso que vc me passou…

Vou colocar os fontes que utilizo pra vc me ajudar com mais rapidez…

Essas duas function abaixo q fazem a minha chamda… no caso quando quero utilizar o ajax eu utilizo sendRequest(parametros…)… só que preciso que nesta chamada do sendRequest(parametros…) o fluxo só siga adiante após a resposta da requisição!!!

Códigos Fontes:

function sendRequest(valor,id,acao) {

var vl = escape(valor);	

var tecla;

valor = vl;

var theUrl = “…/base_ajax.jsp?tela=5&valor=+valor+"&id="+id+"&acao="+acao+"&esc="+getTeclouEsc();

req.open(get, theUrl,true);

req.onreadystatechange = handleResponse;

req.send(null);

}
function handleResponse() {

var status = false;

resultado1 = “”;

if (req.readyState==3){

}

if(req.readyState == 4){

if (req.status==200){

var resultado = req.responseText;

resultado = resultado.replace(/+/g," ");

resultado = unescape(resultado);

AtualizaObjetos(resultado);

status = true;

}

else{

alert(erro no Ajax!!! Tente Novamente!!!);

}

}

return status;

}
C

Achei que você estava usando algum framework, tipo DWR, mas vamos lá…

Primeiro, altere a assinatura do sendRequest() pra receber o nome de uma função de callback. Pelo seu código, esse nome deve ser armazenado em uma variável do script, externa à qualquer função.

var callbackFunction;

function sendRequest(callBack, valor,id,acao) { 
 callbackFunction = callBack;
 ...
}

No handleResponse(), caso tudo tenha executado OK, coloque uma chamada ao método callback:

handleResponse() {
 ...
 AtualizaObjetos(resultado); 
 status = true;
 eval(callbackFunction + "()");
 ...
}

Isso deve bastar.
Lembre-se que isso não prevê várias chamadas simultâneas, nem métodos callback que recebam parâmetros… Como disse, usar um framework facilitaria bastante esses controles e tratamentos…

Cheers!

R

Só não compreendi uma coisa… uma dúvida…

essa chamda: eval(callbackFunction + “()”); seria a função que eu chamaria logo que terminasse a requisição?

Então como se fosse a minha AtualizaObjetos(resultado); ?
ou nada haver?

Att. Roberto

C

Talvez seja a mesma coisa, sim.
Não sei exatamente o que sua AtualizaObjetos() faz, então assumi que seja algum tratamento genérico.
No eval(), estamos chamando a função relacionada ao fluxo de negócios que foi interrompido.

Um exemplo simples, usando o que você tinha passado antes:

sendRequest("gravar", parametros);

Beleza?

R

Desculpe só ter respndido no outro dia…
Entendi sim o que vc quis dizer… realmente a minha funcao eh um tratamento generico e não um especifico para o fluxo de negocios…

Mas tenho um outro problema… seria este o seguinte… o cursor se encontra dentro de um edit !! quando o usuario tecla enter ele pula de campo… nesta saida eu faco a requisição via ajax… mas na entrada do próximo campo tenho onFocus() e tenho uma outra função nesta chamada… então enquanto ele faz a requisição assincrona do ajax o método onFocus() é invocado antes que termine a requisição ajax… acho q não tem como resolver isso neh!!!

Obrigado Amigo

C

Se o onFocus() do segundo campo não depender de informações retornadas pela chamada ao Ajax, não tem problema ele ser executado enquanto a primeira chamada está aguardando retorno.

Se tiver algum comportamento que dependa da chamada ao Ajax, então o código executado nesse onFocus() poderia estar no (ou mesmo ser o) método passado como CallBack da chamada Ajax…

Uma outra situação é esse onFocus() ter uma segunda chamada Ajax; nesse caso, essa estrutura que vc usa e que complementei não funciona. Aí teria que analisar um framework mais completo (DWR, GWT, etc).

Tudo depende dos seus requisitos de navegação, controle de tela, etc.
Não vejo pq inviabilizar o uso de Ajax por conta disso, pelo que você colocou aqui…
O que recomendo é pensar bastante sobre o uso ou não, e como usar essa “tecnologia”, antes de escrever código - se tiver que mudar no meio do caminho, dá um trabalho insano :wink:

Espero ter ajudado. Cheers!

S

Sera q alguem poderia me dar uma luz?

Tava dando uma olhada no cod acima, agora qro saber o q tenho q colocar na minha jsp/servlet q o ajax chamou.
Qual o tipo de resposta devo dar?
Supondo que eu tenha uma busca de nomes.

Value.
Brito.

R

Cheers !!! Muito obrigado pelas dicas… vou estudalas e com certeza serão muito úteis…

Obrigado

Att. Roberto

Criado 28 de junho de 2006
Ultima resposta 3 de jul. de 2006
Respostas 11
Participantes 3