Jump to content
FabianoSouza

Callback de resultado do AJAX - Como faço?

Recommended Posts

Tenho a function A, que captura valores e os transfere para a function B (que é um AJAX).

 

Preciso que a function B passe seu resultado para a function A. Creio que precise de um callback. Mas não estou sabendo com estruturar isso.

Vejam como estão os códigos:

 

FUNCTION A

function upDateRating(e)
{
	var $alvoClick = getTarget(e)
	, $ul = $alvoClick.parentNode
	, $idItem = $alvoClick.parentNode.parentNode.parentNode.parentNode.id
	, $valRating = $alvoClick.value
	var $array = [
	  {
		idItem:$idItem
		, favorito: 1
		, rating: $valRating
	  }
  ]
upDateCard($array)
}

 

FUNCTION B (AJAX)

function upDateCard(e)
  {
  var $array = e
  , $dados = JSON.stringify($array);
function ajax()
  {
	var $obj = createXMLHTTP(); 
	$obj.open('post', 'minhaPagina', true); 
	$obj.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
	$obj.onreadystatechange=function(){
	if ($obj.readyState == 4 && $obj.status == 200){ 
	try {
		var $strResp = JSON.parse($obj.responseText);
		} catch(e) 
		{
		  alert('Erro. Dados em formato inválido.')
		  return false;
		  }
return $strResp //PRECISO PASSAR ESSE VALOR DE VOLTA PARA A FUNCTION A
}
	}
  $obj.send(encodeURI('str='+$dados))
	}
ajax()
  }

 

 

Share this post


Link to post
Share on other sites

@FabianoSouza Para você fazer isso é bem simples, basta mudar o return $strResp, para return upDateRating($strResp), ou upDateRating($strResp), da maneira que você colocou você está retornado o valor de $strResp para o método onreadystatechange.

 

Notei também que tem alguma coisa estranha no seu código, você colocou uma função dentro de outra?

 

Você também tem um problema na sua função A, se você enviar a resposta para a função A a função vai chamar o método upDateCard que chama o método ajax e o método ajax vai chamar novamente a função a, assim a função A vai acabar colocando a aplicação em um loop infinito.

 

Eu nunca vi esse método createXMLHTTP(), ele é algum método que você criou?

 

Vou deixa um exemplo de código com base no seu:

         function upDateRating(e) // Essa função só vai retorna um valor não vai mais chamar o método upDateCard();
            {
                var $alvoClick = getTarget(e), 
                    $ul = $alvoClick.parentNode, 
                    $idItem = $alvoClick.parentNode.parentNode.parentNode.parentNode.id, 
                    $valRating = $alvoClick.value;

                var $array = [
                    {
                        idItem : $idItem, 
                        favorito : 1, 
                        rating : $valRating
                    }
                ]

                return($array);
            }

            function upDateCard($array)
            {
                $array = JSON.stringify($array);
                ajax($array);
            }

            function ajax($array)
            {

                if (window.XMLHttpRequest) 
                {
                    // code for modern browsers
                    $obj = new XMLHttpRequest();
                }
                else
                {
                    // code for old IE browsers
                    $obj = new ActiveXObject("Microsoft.XMLHTTP");
                }

                $obj.open('post', 'server.php', true); 
                $obj.setRequestHeader('content-type', 'application/x-www-form-urlencoded');

                $obj.onreadystatechange = function()
                {
                    if ($obj.readyState == 4 && $obj.status == 200)
                    { 
                        try {
                            var $strResp = JSON.parse($obj.responseText);
                        } 
                        catch(e) 
                        {
                            alert('Erro. Dados em formato inválido.')
                            return false;
                        }
                        return FuncaoC(upDateRating($strResp)); // É melhor cria outro método para manipular o reporta da função A
                    }
                }

                $obj.send(encodeURI('str='+$array));
            }

			function FuncaoC($res)
			{
            	alert($res);
            }

            upDateCard(upDateRating()); // Chamando o upDateCard() com o retorno do método upDateRating();

 

 

Share this post


Link to post
Share on other sites

Olá @gabrielms.

Cara, não sou programador profissa...então vou expor minhas dúvidas como leigo.

(fiz as mudanças no código mas ainda não funciona...estou investigando para ver onde pode haver erros meus de adaptação do código)

 

1) A function upDateRating(e) retorna o array. Isso entendi. Mas o que não entendi é para quem/onde o array é enviado, já que ela não chama function alguma.

 

Me explica o conceito...não consigo enxergar link entre coisas..

 

Na função upDateRating(e), adaptei o trecho

return ($array);

para

return upDateCard($array);

 

Isso fez parte do processo funcionar (grava o que preciso no banco de dados).
Mas ainda não dispara o alert da função FuncaoC. Sinal de que ainda falta algo.

 

Parece que o trecho upDateCard(upDateRating()); não faz nada. Pois eu comentei essa linha e o comportamento geral manteve-se o mesmo.

 

Valew!!

 

 

Share this post


Link to post
Share on other sites

@FabianoSouza A função upDateRating() vai retorna um array, mas pra isso acontecer você tem que passar um valor para ela, nesse caso é o valor que vai ser usado no método getTarget(). O retorno dessa função é utilizado em outro função, a função upDateCard(), que espera receber um array, ele vai fazer uma conversão desse valor array e chama a função ajax() passando esse valor convertido.

 

No código que eu montei eu chama a função upDateCard() passando a função upDateRating(), como o retorno da função upDateRating() e um array, a função upDateCard() vai pegar esse retorno, que e um array, e ele vai fazer a conversão dessa array e chamar a função ajax() passando o valor convertido. 

upDateCard(upDateRating());

Como na sua função upDateRating() você esperar um valor, eu achei que você sabia aonde colocar o valor. O valor vai ser utilizado no método getTarget() dentro da função upDateRating(), e caso esse valor não seja inserido ele não vai retorna nada e vai dar um  erro de sintaxe.

 

Provavelmente esse é o erro na sua aplicação.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By CharlieAldrin
      Estou tentando fazer um chat, e nele é necessário saber se um usuário continua na página do chat, para caso ele saia informar o outro usuário.
      Encontrei em alguns lugares como solução fazer um ajax conferindo se o usuário está "dando sinal de vida" de 10 em 10 segundos (por exemplo), porém não entendi como fazer isso e nem como colocar no código. Alguém pode me ajudar por favor? 
      Ou me informar se existe alguma forma melhor de conferir isso?
       
      Valeu desde já :) 
    • By Aureo Almeida
      Não tenho domínio do uso de Ajax e estou com problema para chamar uma função PHP de um arquivo. Num arquivo chamado atualiza.php possuo uma função para atualizar tabelas de um Banco de Dados com dois insert into, chamada function atualizaPdIt().
      Eu desejo que esta função seja chamada para dentro de um arquivo chamado finaliza_compra.php através do evento onclick de um imput button, que está assim:
      <button onclick=" atualizaCompra ()" class='imput-concluir'>Finalizar</button> O Script que coloquei no Head da página é este:
      <script> function atualizaCompra () { $.ajax({ url:'atualiza.php', complete: function (atualizaPdIt) { alert(atualizaPdIt.responseText); }, error: function () { alert('Erro'); } }); return false; } </script> Porém, a função não é executada. O que está errado? Para constar, o script de atualização do arquivo atualiza.php funciona perfeitamente bem quanto deixado dentro de um bloco de código da página finalizar_compra.php, portanto, não é nele que está o problema, mas na forma como estou chamando.
    • By andre2654
      Boa tarde, eu preciso de ajuda de vocês, estou com um problema que é o seguinte, eu preciso que quando a pessoa clicar na lixeira, exclua essa linha do banco de dados, mas como posso fazer? perdoem a minha inexperiência, mas já busquei bastante a respeito e nada.
    • By kriskastro
      Oi, pessoal. Preciso de uma ajuda de vocês. 
      Tenho esse código de formulário de contato em um dos sites que gerencio e preciso colocar um redirecionamento de URL ao submeter o envio do formulário com sucesso. Atualmente ele só exibe "Mensagem enviada com sucesso!". Já tentei injetar essa função direto pelo javascript, porém as tentativas que fiz foram todas sem sucesso. Podem me ajudar com isso?
       
      A ideia seria enviar as pessoas para uma página de resposta que já desenvolvi.
      <form class="avia_ajax_form av-form-labels-visible avia-builder-el-123 el_after_av_hr avia-builder-el-last av-custom-form-color av-light-form" method="post" name="formhouse"> <fieldset> <p id="element_avia_1_1" class=" first_form form_element form_element_third"><label for="avia_1_1">Nome <abbr class="required" title="required">*</abbr></label> <input id="avia_1_1" class="text_input is_empty" name="nome" type="text" value="" /></p> <p id="element_avia_2_1" class=" form_element form_element_third"><label for="avia_2_1">E-Mail <abbr class="required" title="required">*</abbr></label> <input id="avia_2_1" class="text_input is_empty" name="email" type="text" value="" /></p> <p id="element_avia_3_1" class=" form_element form_element_third"><label for="avia_3_1">Telefone <abbr class="required" title="required">*</abbr></label> <input id="avia_3_1" class="text_input is_phone" name="telefone" type="text" value="" /></p> <p id="element_avia_4_1" class=" first_form form_element form_fullwidth av-last-visible-form-element"><label class="textare_label hidden textare_label_avia_4_1" for="avia_4_1">Mensagem <abbr class="required" title="required">*</abbr></label> <textarea id="avia_4_1" class="text_area is_empty" cols="40" name="mensagem" rows="7"></textarea></p> <p class="hidden"><input id="avia_5_1" class="hidden " name="avia_5_1" type="text" value="" /></p> <center id="msgErroHouse" style="color: red; display: none;">Erro ao enviar a mensagem, preencha todos os campos para continuar</center>&nbsp; <center id="msgShowHouse" style="display: none;">Mensagem enviada com sucesso!</center> <p class="form_element "><input name="avia_generated_form1" type="hidden" value="1" /> <input id="clica-botao-house" class="button" type="button" value="Enviar" /></p> </fieldset> </form> <script language="javascript"> function chama(){ var ret = hc_envia_mensagem(2923, document.formhouse.nome.value, document.formhouse.email.value, '', document.formhouse.telefone.value, document.formhouse.mensagem.value); if(document.formhouse.email.value.trim() != '' && document.formhouse.nome.value.trim() != ''){ jQuery('#msgErroHouse').hide(); jQuery('#msgShowHouse').show(); document.formhouse.nome.value = ''; document.formhouse.email.value = ''; document.formhouse.ddd.value = ''; document.formhouse.telefone.value = ''; document.formhouse.mensagem.value = ''; }else{ jQuery('#msgShowHouse').hide(); jQuery('#msgErroHouse').show(); } } setTimeout(function(){ jQuery('#clica-botao-house').on('click', function(){chama ()}); jQuery('[data-avia-form-id]').hide(); },100) </script>  
    • By HigorCrds
      Bom, o que eu consegui até agora foi fazer com que, ao usuário clicar em algum dos botões de paginação (1, 2, 3...) o PHP guarde uma SESSION com o número da página correspondente.
      Segue o código:
       
      <!-- BOTÃO COM O NÚMERO DA PÁGINA --> <button onclick="mudaVar(<?php echo $i; ?>);"> <?php echo $i; ?> </button> <!-- FUNÇÃO PARA GUARDAR SESSION PG --> function mudaVar(valor) { $.ajax({ url:'sessions.php?valor='+valor }); } // GUARDA SESSION PG if(isset($_GET['valor'])){ $_SESSION['pg'] = $_GET['valor']; } Até aí tudo bem, só que o problema é que a SESSION não é alterada naquele momento, só quando eu atualizo a página.
      Como corrigir isso?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.