Ir para conteúdo

POWERED BY:

Arquivado

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

Andrew Marques

Otimizar Código de Chat

Recommended Posts

Bom dia Galera!!!

 

Estou desenvolvendo (tentando) um sistema de atendimento online...

 

"Aparentemente" ele está funcionando certinho, só que acho que há erros de otimização...

 

Pois tem horas que ele envia tanto requisição ajax para o servidor que chega a travar o Xampp...

 

Segue código JS para darem uma olhada...

 

<script>
		function inicia_chat(){
			ultima_resposta = null;
		
			var form 	= $('#dados_atendimento');
			
			form.submit(function(){
				return false;
			});
			
			form.ajaxSubmit({
				url:"crud.php",
				data: {acao: "iniciar_chat"},
				success: function(resposta){
					if(resposta == 0){
						$("#mensagens_dados_atendimento").attr("class","");
						$("#mensagens_dados_atendimento").addClass("aviso");
						$("#mensagens_dados_atendimento").text("Preencha todos os campos corretamente!");
						$(".mensagens_dados_atendimento").fadeIn("fast");
					}else if(resposta == 1){
						$("#mensagens_dados_atendimento").attr("class","");
						$("#mensagens_dados_atendimento").addClass("erro");
						$("#mensagens_dados_atendimento").text("Erro ao iniciar atendimento, tente novamente!");
						$(".mensagens_dados_atendimento").fadeIn("fast");
					}else if(resposta == 2){
						$("#mensagens_dados_atendimento").attr("class","");
						$("#mensagens_dados_atendimento").addClass("sucesso");
						$("#mensagens_dados_atendimento").text("Iniciando atendimento...");
						$(".mensagens_dados_atendimento").fadeIn("fast");
						window.setTimeout(function(){
							form.fadeOut("fast");
							$("#barra_verde p").html("Estamos contactando um atendente, por favor aguarde...");
							$("#carregando_chat").fadeIn("fast");
							
							function verificaAtendente(){
								$.ajax({
									type: "POST",
									url: "crud.php",
									data: { acao: 'verifica_atendente' },
									success: function ( resposta ){
										if(resposta == 'erro'){
											form.fadeIn("fast");
											$("#barra_verde p").html("Preencha seus dados para iniciar o atendimento.");
											$("#carregando_chat").fadeOut("fast");
											$("#mensagens_dados_atendimento").attr("class","");
											$("#mensagens_dados_atendimento").addClass("erro");
											$("#mensagens_dados_atendimento").text("Erro ao iniciar atendimento, tente novamente!");
											$(".mensagens_dados_atendimento").fadeIn("fast");
										}else if(resposta == 0){
										}else if(resposta != 'erro' && resposta != 0){
											var result = resposta.split("&");
											var nomeAtendente = result[0];
											var dataInicio = result[1];
											var horaInicio = result[2];
											
											$("#barra_verde p").html("Você está online atualmente com <b>"+nomeAtendente+"</b>.");
											$("#atendimento_iniciado p").html("Atendimento iniciado em <b>"+dataInicio+"</b> às <b>"+horaInicio+"</b>.");
											$("#carregando_chat").fadeOut("fast");
											$("#chat_online").fadeIn(500);
											clearInterval(verifica_atendente);
										}
									}
								});
							}
							var verifica_atendente = setInterval(function(){verifica_style_chat()}, 1000);
							var verifica_atendente = setInterval(function(){verificaAtendente()}, 1000);
						}, 2000);
					}
				}
			});
		}
		
		function verifica_style_chat(){
			var chat = $("#chat_online").attr("style");
			if(chat == 'display:none'){
			}else if(chat == ''){
				atualiza_chat();
			}
		}
		
		function atualiza_chat(){
			window.setInterval(function(){
				$.ajax({
					type: "POST",
					url: "crud.php",
					data: { acao: 'atualiza_chat' },
					success: function ( resposta ){
						if (resposta != ultima_resposta){
							$("#chat").html(resposta);
							var chatScroll = $('#chat_scroll').height();
							$('#chat_scroll').scrollTop(chatScroll);
							ultima_resposta = resposta;
							var audio = new Audio('img/alerta.mp3');
							audio.play();
						}
					}
				});
			}, 500);
		};
		
		function envia_mensagem(){
			var form 	= $('#escrever_mensagem');
			
			form.submit(function(){
				return false;
			});
			
			form.ajaxSubmit({
				url:"crud.php",
				data: {acao: "enviar_mensagem"},
				success: function ( resposta ){
					if(resposta == 'erro'){
					}else if(resposta == 'sucesso'){
						$("#mensagem").val('');
						$("#mensagem").blur();
					}
				}
			});
		}
		</script>

 

Quem tiver uma dica ou algo que posso melhorar, ficarei grato.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode me passar seu e-mail pra gente contra algumas informações?Estou fazendo um projeto parecido com seu.
Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Andrew,

 

No success do ajax do inicia_chat você faz isso aqui:

var verifica_atendente = setInterval(function () {    
    verifica_style_chat()
}, 1000);

Quer como você sabe, vai chamar a verifica_style_chat a cada 1000ms.

 

Dento da verifica_style_chat você chama a atualiza_chat que usa um setInterval pra fazer um request ajax a cada 500ms.

Eu sei que tem um IF dentro da verifica_style_chat, mas se a atualiza_chat for chamada mais de uma vez, você inicia outro setInterval.

 

atualiza_chat chamada 1x: 2 requests ajax (dentro do atualiza_chat) por segundo.

atualiza_chat chamada 2x: 4 requests ajax por segundo.

...

...

30 segundos depois, atualiza_chat chamada 30x; 60 requests ajax por segundo.

 

Tem que ver isso ae.

 

OUTRA COISA: não recomendo que o atuallza_chat use setInterval. É melhor você chamá-lo apenas uma vez, e DENTRO dele (no success/complete) ele se chama novamente. Assim caso a rede dê lag os requests não se atropelam.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz assim: coloque um console.log('nome_da_funcao') dentro de cada função dessa, e acompanhe seu log pra ver se alguma delas está sendo chamada muito mais do que o esperado. Com esse monte de setTimeout / interval que vocÊ tá usando dá pra se perder haha.

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.