Foros del Web » Programando para Internet » Javascript »

problemas con seTimeout()

Estas en el tema de problemas con seTimeout() en el foro de Javascript en Foros del Web. Hola: Estoy intentando utilizar la funcion setTimetout() con parametros y me esta dando problemas, ya he revisado varios post con soluciones, las he intentado aplicar ...
  #1 (permalink)  
Antiguo 20/05/2010, 06:46
 
Fecha de Ingreso: abril-2010
Ubicación: L'Hospitalet de LLobregat
Mensajes: 43
Antigüedad: 14 años
Puntos: 0
Pregunta problemas con seTimeout()

Hola:

Estoy intentando utilizar la funcion setTimetout() con parametros y me esta dando problemas, ya he revisado varios post con soluciones, las he intentado aplicar pero no consigo solucionarlo. El problema es que no me pasa la variable que deseo.

Código Javascript:
Ver original
  1. //funcion que printa en la web (genera codigo html) de los productos añadidos
  2. function play(){
  3.   var msg_text = document.getElementById("msg_text");
  4.  
  5.   //removing the list
  6.   if ( msg_text.hasChildNodes() ){
  7.       while ( msg_text.childNodes.length >= 1 ){
  8.           msg_text.removeChild( msg_text.firstChild );      
  9.       }
  10.   }
  11.    
  12.     //volvemos a crear la lista
  13.     var ul = document.createElement("ul");
  14.    
  15.     //rellenamos la lista entera al completo
  16.     for (i; i<listaGeneral.length; i++){
  17.         setTimeout("rellenar("+ul+")",1000);
  18.             //rellenar(ul);
  19.         }
  20.     msg_text.appendChild(ul);
  21. }
  22.  
  23. function rellenar(ul){
  24.    
  25.         var li = document.createElement("li");
  26.        
  27.         if(listaGeneral[i].tipo=="message"){
  28.            
  29.             var mensajeMostrado = "<span class=message>"+listaGeneral[i].numero+": "+listaGeneral[i].nombre1+" le dice a "+listaGeneral[i].nombre2+" : "+listaGeneral[i].mensaje+"</span>";
  30.         }else{
  31.             var mensajeMostrado = "<span class=order>"+listaGeneral[i].numero+": "+listaGeneral[i].mensaje+"</span>";
  32.         }
  33.        
  34.         li.innerHTML = mensajeMostrado;
  35.    
  36.         ul.appendChild(li);
  37.        
  38. }

Si en vez de setTimeout("rellenar("+ul+")",1000); pongo rellenar(ul); si que me funciona, pero claro no me lo va rellenando poco a poco (cada segundo). he probado también de poner setTimeout("rellenar("'+ul+'")",1000); y todo tipo de posiblidades, comillas simples todo, comillas simples donde estan las dobles y al reves... pero no me sale.

Muchas gracias por la ayuda, un saludo!!!!!!!!!!
  #2 (permalink)  
Antiguo 20/05/2010, 07:07
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: problemas con seTimeout()

lo que sucede es que setTimeout, al igual que otras funciones, ejecutan el codigo en el contexto global. entonces, cuando intentas usar una variable local de una funcion en setTimeout, el interprete intentara buscar esa variable en el ambito global y por ende, al no estar definida como variable global, se genera error. lo que tienes que hacer es crear una funcion anonima en setTimeout para que se cree un closure de la variable local.
Código:
setTimeout(function(){
// aqui invocas tu funcion con los parametros necesario;
}, 1000);
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 20/05/2010, 08:00
 
Fecha de Ingreso: abril-2010
Ubicación: L'Hospitalet de LLobregat
Mensajes: 43
Antigüedad: 14 años
Puntos: 0
Respuesta: problemas con seTimeout()

La verdad que no se si lo estoy poniendo bien (he probado bastantes maneras) pero me sigue sin ir...
Código Javascript:
Ver original
  1. for (i; i<listaGeneral.length; i++){
  2.         setTimeout(function(){'rellenar('+ul+')';}, 1000);
  3.     }
  #4 (permalink)  
Antiguo 20/05/2010, 08:15
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: problemas con seTimeout()

la invocacion a tu funcion no se hace en formato de string... invoca tu funcion de manera comun y corriente, tal como harias con cualquier otra funcion.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #5 (permalink)  
Antiguo 20/05/2010, 08:39
 
Fecha de Ingreso: abril-2010
Ubicación: L'Hospitalet de LLobregat
Mensajes: 43
Antigüedad: 14 años
Puntos: 0
Respuesta: problemas con seTimeout()

He probado de manera común y tampoco me funciona:

Código Javascript:
Ver original
  1. for (i; i<listaGeneral.length; i++){
  2.        
  3.         setTimeout(function(){rellenar(ul);}, 1000);  //asi no me funciona
  4.         //rellenar(ul); ---------> asi si que me funciona
  5.     }

Muchas gracias por la ayuda!
  #6 (permalink)  
Antiguo 20/05/2010, 09:00
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: problemas con seTimeout()

se supone que tal como lo tienes en la linea 3 te debe funcionar, no creo que ahi es donde reside el problema. verifica la consola de errores a ver que te indica.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #7 (permalink)  
Antiguo 20/05/2010, 15:20
 
Fecha de Ingreso: abril-2010
Ubicación: L'Hospitalet de LLobregat
Mensajes: 43
Antigüedad: 14 años
Puntos: 0
Respuesta: problemas con seTimeout()

Si, estaba bien como decias, el problema era otro.
La cuestion estaba en como trataba la llamada a la funcion, que con un for no estaba bien ya que iva llamando y aumentando el valor de i, entonces cuando queria printar ya no tenia la i valor maximo y aun no se habia ejecutado en ningun momento (ya que tenia puesto 1000 como valor, y un bucle while va mucho mas rapido).

ahi va la solución:
Código Javascript:
Ver original
  1. //funcion que printa en la web (genera codigo html) de los productos añadidos
  2. function play(){
  3.     var msg_text = document.getElementById("msg_text");
  4.     //removing the list
  5.     if ( msg_text.hasChildNodes() ){
  6.         while ( msg_text.childNodes.length >= 1 ){
  7.         msg_text.removeChild( msg_text.firstChild );      
  8.         }
  9.     }
  10.    
  11.     //volvemos a crear la lista
  12.     var ul = document.createElement("ul");
  13.    
  14.     //rellenamos la lista entera al completo
  15.     rellenar(ul);
  16.    
  17.     msg_text.appendChild(ul);
  18. }
  19.  
  20. function rellenar(ul){
  21.    
  22.      if(i < listaGeneral.length) {
  23.             i++;
  24.             var li = document.createElement("li");
  25.            
  26.             if(listaGeneral[i].tipo=="message"){
  27.                
  28.                 var mensajeMostrado = "<span class=message>"+listaGeneral[i].numero+": "+listaGeneral[i].nombre1+" le dice a "+listaGeneral[i].nombre2+" : "+listaGeneral[i].mensaje+"</span>";
  29.             }else{
  30.                 var mensajeMostrado = "<span class=order>"+listaGeneral[i].numero+": "+listaGeneral[i].mensaje+"</span>";
  31.             }
  32.            
  33.             li.innerHTML = mensajeMostrado;
  34.            
  35.             ul.appendChild(li);
  36.             setTimeout(function(){rellenar(ul);}, 1000);
  37.      }
  38. }

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:07.