Ir para conteúdo

POWERED BY:

Arquivado

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

GHS

Problema com retorno de função

Recommended Posts

Olá,

 

Estou desenvolvendo um sisteminha de Chat integrado com PHP com NodeJS (javascript sever-side, para quem não conhece) e me deparei com um problema, porém, não é necessário saber sobre Node para resolver este problema, somente Javascript mesmo.

 

  check: function(token, ip, agent)
 {
   var ret = null

   if (this.list[token] === null || typeof(this.list[token]) != 'object')
   {
     var MySQL_Client = require('./lib/mysql').Client
     var client = new MySQL_Client()

     client.port = MySQL.port
     client.host = MySQL.host
     client.user = MySQL.user
     client.password = MySQL.pass

     client.connect(function(err, res)
     {
       if (err)
       {
         console.log('Erro MySQL: ' + err.message)
         return
       }

       client.query('USE ' + MySQL.name, function(err, res)
       {
         if (err)
         {
           console.log('Erro MySQL: ' + err.message)
           return
         }

				client.query("SELECT * FROM chat_sessions WHERE token = '" + token + "' AND ip = '" + ip + "' AND agent = '" + phpjs.addslashes(agent) + "'", function(err, res, fields)
				{
           if (err)
           {
             console.log('Erro MySQL: ' + err.message)
             return
           }

			  	if (res.length)
			  	{
			    	sessions.list[token] = {
			      	'uid': res[0].uid,
			      	'nick': res[0].nick,
			      	'token': token,
			      	'ip': ip,
			      	'agent': agent,
			      	'mod': res[0].mod,
			      	'updated': phpjs.time()
			    	}

             console.log('achou');

			    	ret = true
			  	}
			  	else
			  	{
			    	ret = false
			  	}
				})
       })
     })
   }
   else if (this.list[token].ip == ip && this.list[token].agent == agent)
   {
     ret = true
   }

   console.log('retornando...');

   return ret
 },

 

Ao lerem a função, verão que checarei se uma variável existe: se não, crio uma conexão MySQL utilizando várias funções e depois utilizo a variável "ret" para guardar o valor de retorno, para no final, a função principal retornar este valor. O meu problema é que a função está retornando o "ret" antes dos códigos MySQL serem executados, pelo o que pude constatar adicionando logs no console e checando pelo terminal:

 

consolesa.png

 

Notem que o "retornando..." aparece antes do "achou", que é um código situado acima. Até agora não consegui pensar em nenhuma maneira da função esperar o MySQL executar para retornar o valor; pensei em usar um setInterval que checasse quando o ret muda de valor de "null" pra true ou false, porém não vejo meio de retornar o valor.

 

Por favor, me ajudem!

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara, tenta estudar sobre funções de callback, acredito que isso deva resolver teu problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que não consigo montar uma função de callback pois preciso retornar o valor direto na função "check()", veja minha tentativa:

 


   function mudouRet()
   {
     if (ret !== null)
     {
       return ret
     }

     return setInterval('mudouRet()', 500);
   }

   return mudouRet();

 

O problema é que o valor retornado pelo setInterval não é o retorno da função chamada no primeiro parâmetro, e sim o ID do timer para pará-lo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Calma... esquece o setInterval.

 

Agora volta.

Não vi onde você tentou fazer a função de callback.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui! Tinha me dado um branco no conceito de callback, aqui está o código funcionando:

 

  check: function(token, ip, agent, callback)
 {
   if (this.list[token] === null || typeof(this.list[token]) != 'object')
   {
     var MySQL_Client = require('./lib/mysql').Client
     var client = new MySQL_Client()

     client.port = MySQL.port
     client.host = MySQL.host
     client.user = MySQL.user
     client.password = MySQL.pass

     client.connect(function(err, res)
     {
       if (err)
       {
         console.log('Erro MySQL: ' + err.message)
         return
       }

       client.query('USE ' + MySQL.name, function(err, res)
       {
         if (err)
         {
           console.log('Erro MySQL: ' + err.message)
           return
         }

				client.query("SELECT * FROM chat_sessions WHERE token = '" + token + "' AND ip = '" + ip + "' AND agent = '" + phpjs.addslashes(agent) + "'", function(err, res, fields)
				{
           if (err)
           {
             console.log('Erro MySQL: ' + err.message)
             return
           }

				  if (res.length)
				  {
				    sessions.list[token] = {
				      'uid': res[0].uid,
				      'nick': res[0].nick,
				      'token': token,
				      'ip': ip,
				      'agent': agent,
				      'mod': res[0].mod,
				      'updated': phpjs.time()
				    }

             console.log('achou');

				    callback(true)
				  }
				  else
				  {
				    callback(false)
				  }
				})
       })
     })
   }
   else if (this.list[token].ip == ip && this.list[token].agent == agent)
   {
     callback(true)
   }
   else
   {
     callback(false)
   }
 },

 

Obrigado! ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui! Tinha me dado um branco no conceito de callback, aqui está o código funcionando:

Parabéns ^_^

 

às vezes agente só precisa disso:

Um pouco de calma e abandonar possíveis soluções que não estão levando a lugar nenhum.

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.