Ir para conteúdo

POWERED BY:

Arquivado

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

dataset

[Resolvido] $.when

Recommended Posts

Olá...

Tenho duas funções, ambas retornam True ou False:

 

Verifica se o aluno já está matriculado na turma, se já estiver, retorna True, caso contrário retorna False.

function alunoTurma(){
$.post('/paratodos/consultas/alunoturma.asp',{codTur: $('#codCur').val()}, function (retAlunoTurma) {return retAlunoTurma})
}

 

Verifica se há vagas na turma, se houver retorna True, se não houver retorna False.

function vagaTurma(){
$.post('/paratodos/consultas/vagaturma.asp',{codTur: $('#codCur').val()}, function (retVagaTurma) {return retVagaTurma})
}

 

Daí chamo essa função:

$(document).ready(function () {
$('#fEnviar').click(function(event) {
    event.preventDefault();
    $.when(!alunoTurma(), vagaTurma()).then(function(){
	$('#modo').val($('#fEnviar').attr('href'));
	$('#IdFormTurmasAluno').submit();
    }).fail(function(){
	Se alunoTurma == False então mensagem personalizada UM;
	Se vagaTurma == False então mensagem personalizada DOIS;
    });
});
;});

 

A ideia era apenas dar o submit se alunoTurma()==False e vagaTurma()==True.

Caso contrario o window.alert() também tinha que ser específico pra cada ocasição.

 

Pensei em fazer com $.when

 

Mas acho que não dá ne ?

 

Valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom... fiquei essa tarde estudando jQuery e consegui resolver dessa maneira.

 

Mas veja que ficou tudo junto, pois eu coloquei um $.post dentro do outro. Eu gostaria de fazer cada requisição separada, dai usando uma função, eu iria chamando as requisições isoladamente, conforme o resultado eu iria tomando decisões.

 

Eu tenho uma tela que vai fazer umas 4 ou 5 verificações antes de submitar, imagina fazer um cascata de $.post... não fica muito elegante.

 

Como eu posso fazer uma função pra cada $.post e depois chamar e submitar conforme o return de cada um ?

 

Veja o código que fiz funcionando tudo misturado.

$(document).ready(function () {

$('#fEnviar').click(function(event) {
	event.preventDefault();

	$.post('/paratodos/consultas/alunoturma.asp',{codTur: $('#codCur').val()}, 
	    function (retAlunoTurma) {
		if (retAlunoTurma == '1') {
		    window.alert('Aluno já cadastrado nessa turma');$('#codCur').focus();
		}
		else {
		    $.post('/paratodos/consultas/vagaturma.asp',{codTur: $('#codCur').val()}, 
			function (retVagaTurma) {
			    if (retVagaTurma == '1') {
				window.alert('Limite de vagas alcançado');$('#codCur').focus();
			    }
			    else {
					$('#modo').val($('#fEnviar').attr('href')); 
					$('#IdFormTurmasAluno').submit();
			    }
			}
		    );
		}
	    }
	);

});

;});

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cria as 4 ou 5 funções fora do $.post.

 

E então, no callback da primeira requisição você chama a primeira função. No callback do $.post dessa função, você chama a segunda e assim por diante.

 

Se quiser uma coisa mais "Orientada a Objetos", tem esse micro-script do John Resig que permite de forma bem elegante.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Bruno...

 

Então, veja o primeiro exemplo que postei. Eu fiz uma função pra cada $.post. É assim ? Mas não sei como usar o callback.

 

você poderia fazer um exemplo simples pra eu desenvolver em cima e estudar ?

 

Eu li varias vezes esse link: http://www.maujor.com/blog/2011/02/01/o-objeto-deferred-da-jquery-1-5, mas os exemplos não me ajudaram. Consegui usar somente o $.when...

 

Faz um modelinho pra eu estudar...

 

Agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dá uma olhada nesse Fiddle que eu acho que você vai entender.

 

Nele eu defino que no sucesso da requisição seja disparada uma função de callback showSiteName() e, no corpo dessa função, definida fora do jQuery.ready() eu faço outra requisição ridiculamente idêntica para demonstração.

 

Ambas as funções recebem um argumento que é a resposta da requisição, passada automaticamente pela jQuery.

 

Seu caso será o mesmo, só não estou bem certo se definir apenas o nome da função no lugar da sua function vai funcionar, porque não gosto muito desse "atalho" jQuery.post().

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno... Me desculpe, to lendo varias vezes pra tentar aprender esse trem. Preciso que você me ensine.

 

Pelo que entendi, no sucesso do ready você chamou a showSiteName. Ok..

Parece que no meu caso é o contrário.

Função verifica1(vVal)
   $.post verifica no arquivo a.asp e retorna true ou false
fim função

Função verifica2(vVal)
   $.post verifica no arquivo b.asp e retorna true ou false
fim função

Função verifica3(vVal)
   $.post verifica no arquivo c.asp e retorna true ou false
fim função

 

Ao clicar no botão pra dar submit verifico se as funções acima foram validadas:

$(document).ready(function () {
       $('#fEnviar').click(function(event) {
           verifica se as funções verifica1(par1), verifica2(par2) e verifica3(par3) foram validadas
           se sim
                 $('#IdFormTurmasAluno').submit();
           se não 
                 window.alert('Não pode dar submit');
       });
;});

 

Só posso dar sumbit se as funções foram validadas.

Não sei se essas funções devem estar dentro do $(document).ready(function () {. Será que é isso ?

 

@#%$~& Como eu sou burro ... raiva.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que eu entendi do seu post inicial, você quer fazer validações em cascata, isto é, se passar pela primeira faz uma segunda, se passar pela segunda faz uma terceira e por aí vai.

 

success é uma opção de $.ajax, não estou bem certo como $.get e $.post fazem o mesmo.

 

$.ajax({

   url: 'url/da/requisicao',

   type: 'POST',

   success: XXX
});

Esse XXX pode ser duas coisas, uma função inline, anônima, como uma Closure que temos no PHP (não sei se é sua área):

 

$.ajax({

   url: 'url/da/requisicao',

   type: 'POST',

   success: function( response ) {

       // Do somethinf with $( response )
   }
});

Ou pode ser uma função externa anteriormente definida:

 

$.ajax({

   url: 'url/da/requisicao',

   type: 'POST',

   success: myFunction
});

function myFunction( response ) {

   // Do something with $( response )
}

Em eu tendo entendido certo a primeira requisição vai dentro do jQuery.ready() que, quando apontando para document é quando ele está "pronto", isto é, toda árvore de nós DOM foi construída no navegador.

 

Essa primeira requisição vai chamar a primeira função externa e a primeira funcção externa fará uma nova requisição, porém, tendo o seu callback de sucesso apontando para a segunda função:

 

$.ajax({

   url: 'url/da/requisicao',

   type: 'POST',

   success: firstFunction
});

function firstFunction( response ) {

   if( condicao_se_false ) {

       alert( 'Na na ni na não' );

   } else {

       // Se sucesso

       $.ajax({

           url: 'url/da/requisicao',

           type: 'POST',

           success: secondFunction
       });
   }
}

function secondFunction( response ) {

   if( condicao_se_false ) {

       alert( 'Na na ni na não' );

   } else {

       // Se sucesso

       $.ajax({

           url: 'url/da/requisicao/2',

           type: 'POST',

           success: thirdFunction
       });
   }
}

Veja que a segunda função, callback da primeira já invoca uma thirdFunction, aqui omitida. Basta, agora continuar.

 

thirdFunction verifica alguma (opcional) e, se disparar alguma requisição AJAX a qual possa ter uma validação seguinte, repete o esquema.

 

Se for a última (você disse que seriam cinco, né), ao invés de chamar uma outra função, você faz ali, inline mesmo, habilitando ou desabilitando o botão, submetendo o formulário, desenhando um arco-íris na tela... :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá novamente...

 

Estou a dias tentando achar uma solução pra esse problema mas até agora nada... veja só esse outro caso.

 

Não posso dar submit caso a variável seja false:

dadospf.jpg

 

Como posso resolver isso ?

 

Preciso de ajuda. Tenho vários formulários que precisam ser validados com o $.post mas não sei como fazer.

Tirei as concatenações para facilitar a edição:

 

$('#fEnviar').click(function(event) {
   var MSN = true;
event.preventDefault();

   if ( ($('#fEnviar').attr('href')=='Gravar') || ($('#fEnviar').attr('href')=='Alterar') ) {
	if ( ($('#nomEnt').val() == '') && (MSN) ) {window.alert('ALERTA DO SISTEMA !\n\nDigite o Nome');$('#nomEnt').focus();MSN = false;}
       if ( ($('#CPFControle').val() == '1')  && (MSN) ) {
           if ( ($('#cicNum').val() == '') && (MSN) ) {
               window.alert('ALERTA DO SISTEMA !\n\nDigite o CPF');$('#cicNum').val();$('#cicNum').focus();MSN = false;
           }
           else {
               $.post('/paratodos/consultas/consultacpf.asp',{strCPF: $('#cicNum').val()}, 
                   function(strRetorno){
                       if(strRetorno != ''){window.alert('ALERTA DO SISTEMA !\n\nCPF já cadastrado para: ' + strRetorno);$('#cicNum').focus();MSN = false;}
                   }
               );
           }
       }
	if ( ($('#codPai').val() != '') && (MSN) ) {
		if( ($('#strUF').val() == '') && (MSN) ){window.alert('ALERTA DO SISTEMA !\n\nSelecione a UF');$('#strUF').focus();MSN = false;}
		if( ($('#strCid').val() == '') && (MSN) ){window.alert('ALERTA DO SISTEMA !\n\nSelecione a Naturalidade');$('#strCid').focus();MSN = false;}
	}
	if (MSN) {
		$('#modo').val($('#fEnviar').attr('href'));
           $('#IdFormDadosPF').submit();
	}
}
   if ( $('#fEnviar').attr('href') == 'Excluir' ) {
	if (window.confirm('ALERTA DO SISTEMA !\n\nAo EXCLUIR a Entidade selecionada, todo o histórico será eliminado do Sistema. Deseja continuiar ?\n\nEssa ação não possui retorno')){ 
		location.href = '../painelcontrole/excent.asp';
	}
}

});

 

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não entendi qual a dificuldade.

 

Comece essa codificação do zero primeiro pela estruturação das diversas validações em funções:

 

$( document ).ready( function() {

   // Nada ainda
})

function firstValidation( response ) {}

function secondValidation( response ) {}

function thirdValidation( response ) {}

Então dispare a aqui nomeada firstValidation() dentro do do jQuery.click(), informando como argumento a variável do manipulador de eventos:

 

$( document ).ready( function() {

   $( '#fEnviar' ).click( function( event ) {

       firstValidation( event );
   });
})

function firstValidation( event ) {}

function secondValidation( response ) {}

function thirdValidation( response ) {}

Faça o primeiro jQuery.ajax() dentro de firstValidation() e invoque a aqui nomeada secondValidation() no atributo success:

 

$( document ).ready( function() {

   $( '#fEnviar' ).click( function( event ) {

       firstValidation( event );
   });
})

function firstValidation( event ) {

   $.ajax({

       url: 'url/da/requisicao',

       type: 'POST',

       success: secondValidation
   });
}

function secondValidation( response ) {}

function thirdValidation( response ) {}

Repita o procedimento em secondValidation() mas invocando thirdValidation() e assim sucessivamente tantas vezes quantas forem necessárias:

 

$( document ).ready( function() {

   $( '#fEnviar' ).click( function( event ) {

       firstValidation( event );
   });
})

function firstValidation( event ) {

   $.ajax({

       url: 'url/da/requisicao',

       type: 'POST',

       success: secondValidation
   });
}

function secondValidation( response ) {

   if() {

       /**
        * Esta condição será caso a requisição anterior,
        * aqui feita em firstValidation() retornar algum tipo
        * de erro, como por exemplo, se um CPF já estiver
        * cadastrado
        *
        * Para essa comparação use $( response )
        */

   } else {

       $.ajax({

           url: 'url/da/requisicao',

           type: 'POST',

           success: thirdValidation
       });
   }
}

function thirdValidation( response ) {}

Quando você quebra uma grande lógica em vários pedaços menores e mais específicos, além de você melhorar a legibilidade, facilita a manutenção.

 

Agora é com você.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu certo amigo...

 

Depois que a gente aprende fica aquela frase na mente: "Como é simples"...

 

B.A ... Te agradeço a ajuda. Se não fosse você não teria conseguido.

 

Segue o código na íntegra.

$(document).ready(function () {

$('#fEnviar').click(function(event) {

       var MSN = true;
    event.preventDefault();

       if ( ($('#nomEnt').val() == '') && (MSN) ) {window.alert('ALERTA DO SISTEMA !\n\nDigite o Nome');$('#nomEnt').focus();MSN = false;}

       if ( ($('#CPFControle').val() == '1') && (MSN) ){
           PesquisaCPF();
       }
       else if(MSN) {
           fAvanca('');
       }
   });

;});

function PesquisaCPF(){
   if ($('#cicNum').val() == '') {
       window.alert('ALERTA DO SISTEMA !\n\nDigite o CPF');$('#cicNum').val();$('#cicNum').focus();
   }
   else {

       $.ajax({
           type : 'post',
           url : '/paratodos/consultas/consultacpf.asp',
           data : 'strCPF='+ $('#cicNum').val(),
           dataType : 'html',
           success : fAvanca
       });

   }
}

function fAvanca( strRetornoCPF ){
   var MSN = true;
   if( strRetornoCPF != ''){
       window.alert('ALERTA DO SISTEMA !\n\nCPF já cadastrado para: ' + strRetornoCPF );$('#cicNum').focus();
   }

   else {

	if ($('#codPai').val() != '') {
		if ($('#strUF').val() == '') {window.alert('ALERTA DO SISTEMA !\n\nSelecione a UF');$('#strUF').focus();MSN=false;}
		if ( ($('#strCid').val() == '') && (MSN) ) {window.alert('ALERTA DO SISTEMA !\n\nSelecione a Naturalidade');$('#strCid').focus();MSN=false;}
	}

	if (MSN) {
		$('#modo').val($('#fEnviar').attr('href'));
           $('#IdFormDadosPF').submit();
	}

   }

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda dá pra enxugar mais um pouquinho, mas é issoa aí. :thumbsup:

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.