Foros del Web » Programando para Internet » Javascript »

SetInterval y SetTimeOut, no crean el delay esperado

Estas en el tema de SetInterval y SetTimeOut, no crean el delay esperado en el foro de Javascript en Foros del Web. Es que invoco a una funcion pero tengo que hacer que sea a diferentes tiempos pero si lo hago con SetInterval o SetTimeOut, aunque especifique ...
  #1 (permalink)  
Antiguo 24/11/2007, 23:45
 
Fecha de Ingreso: febrero-2005
Mensajes: 626
Antigüedad: 19 años, 2 meses
Puntos: 10
SetInterval y SetTimeOut, no crean el delay esperado

Es que invoco a una funcion pero tengo que hacer que sea a diferentes tiempos pero si lo hago con SetInterval o SetTimeOut, aunque especifique tiempos distintos, siempre invoca a la funciones al mismo tiempo y no quiero eso, ustedes que me recomiendan?, por favor no muevan el tema a ajax, que esto es una duda de como crear un tiempo de espera para la invocacion de una funcion la cual no necesariamente estaria relacionada con ajax, podria ser con otra cosa, y aqui es donde esta la gente que sabe muchisimo de javascript

y a intente

window.SetInterval
window.SetTimeOut

y sin el window., tambien, pero invoca siempre las funciones sin el tiempo de retardo que segun crean estos metodos

Gracias de antemano

Código PHP:
function crear(){



        
setInterval("cambiar('Procesador,1','Procesador','');",50);
        
setInterval("cambiar('Memorias RAM,1','Memorias RAM','');",5);

    
setInterval("cambiar('Tarjeta Madre,1','Tarjeta Madre','');",100);
}


function 
cambiar(nombre,ide,tipo){ 
         
ajax=nuevoAjax(); 
        
ajax.open("GET""recibir.php?nombre="+nombre+"&ide="+ide+"&tipo="+tipo+""true); 
                
ajax.onreadystatechange=function() 
        { 
            if (
ajax.readyState==1)
            {
                
// Mientras carga elimino la opcion "Elige pais" y pongo una que dice "Cargando"
                
document.getElementById(ide).innerHTML="<center><img src=loading.gif /></center>";
            }
            if (
ajax.readyState==4)
            { 
                
document.getElementById(ide).innerHTML=ajax.responseText;
            } 
        }
        
ajax.send(null);
    } 
  #2 (permalink)  
Antiguo 25/11/2007, 03:52
Avatar de JavierB
Colaborador
 
Fecha de Ingreso: febrero-2002
Ubicación: Madrid
Mensajes: 25.052
Antigüedad: 22 años, 2 meses
Puntos: 772
Re: SetInterval y SetTimeOut, no crean el delay esperado

Hola August

Prueba asignando los intervalos a una variable:

Código PHP:
pepe setInterval("cambiar('Procesador,1','Procesador','');",50);
paco =  setInterval("cambiar('Memorias RAM,1','Memorias RAM','');",5);

jorgito =  setInterval("cambiar('Tarjeta Madre,1','Tarjeta Madre','');",100); 
Saludos,
  #3 (permalink)  
Antiguo 25/11/2007, 04:51
 
Fecha de Ingreso: febrero-2005
Mensajes: 626
Antigüedad: 19 años, 2 meses
Puntos: 10
Re: SetInterval y SetTimeOut, no crean el delay esperado

Hola JavierB

Gracias por contestarme, antes no funcionaba en ningun explorador, ahora solo funciona en Internet Explorer

Mozilla, sigue haciendo la invocacion simultanea y eso no me permite la asincronia correcta de la funcion
  #4 (permalink)  
Antiguo 25/11/2007, 08:12
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: SetInterval y SetTimeOut, no crean el delay esperado

Yo diría que dentro de la función cambiar() te falta declarar la variable ajax como local adjuntandole var, creo que si la variable es global se sobreescribe y no funciona como se espera.

Prueba eso y nos comentas

Por cierto, ¿cómo notas los retardos con 50ms, 5ms y 100ms ? Quizás deberías hacer la prueba más lentamente con retardos más largos para ver qué pasa ahí.


Un saludo
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #5 (permalink)  
Antiguo 25/11/2007, 15:36
 
Fecha de Ingreso: febrero-2005
Mensajes: 626
Antigüedad: 19 años, 2 meses
Puntos: 10
Re: SetInterval y SetTimeOut, no crean el delay esperado

jejeje, pues muchas gracias a todos, efectivamente era necesario definar la variable ajax

y finalmente me quede con el setTimeOut, el problema es que para ejecutarse mas eficientemente lo meti dentro de un ciclo, lo cual ya me empezo a dar problemas
Cita:
function crear(){

var compos=new Array("Gabinete","Tarjeta Madre","Procesador","Memorias RAM","Disco Duro","Monitor","Tarjeta de Video","Unidad Optica","Segunda Unidad Optica","Tarjeta de Sonido","Bocinas","Disquet","Tarjetas de Memoria","Raton y Teclado","Sistema Operativo","Energia");
var tiemp=0;
for (i = 0; i <= 16; i++){
var primarg=compos[i]+",1";
var segunarg=compos[i];
var tiempotres[i]=setTimeout("cambiar(primarg,segunarg,'');",tiemp) ;
var tiemp=tiemp+2000;

}
}


function cambiar(nombre,ide,tipo){
var ajax=nuevoAjax();
ajax.open("GET", "recibir.php?nombre="+nombre+"&ide="+ide+"&tipo="+ tipo+"", true);
ajax.onreadystatechange=function()
{
if (ajax.readyState==1)
{
// Mientras carga elimino la opcion "Elige pais" y pongo una que dice "Cargando"
document.getElementById(ide).innerHTML="<center><i mg src=loading.gif /></center>";
}
if (ajax.readyState==4)
{
document.getElementById(ide).innerHTML=ajax.respon seText;
}
}
ajax.send(null);
}
if (ajax.readyState==4)
{

En la linea de la llave dice que se esperaba un objeto

Última edición por August; 25/11/2007 a las 16:04
  #6 (permalink)  
Antiguo 25/11/2007, 18:09
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: SetInterval y SetTimeOut, no crean el delay esperado

No lo entiendo, debería darte error en esta línea:
var tiempotres[i]=setTimeout("cambiar(primarg,segunarg,'');",tiemp) ;

Ya que si quieres pasar primarg y segunarg a la función cambiar(), la llamada está mal hecha. Como son strings las debes entrecomillar, y además así:
var tiempotres[i]=setTimeout("cambiar('"+primarg+"','"+segunarg+"', '');",tiemp) ;

Mira a ver si te funciona de esta manera
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #7 (permalink)  
Antiguo 25/11/2007, 20:28
 
Fecha de Ingreso: febrero-2005
Mensajes: 626
Antigüedad: 19 años, 2 meses
Puntos: 10
Re: SetInterval y SetTimeOut, no crean el delay esperado

De hecho solo funciona para la primera vuelta al ciclo ya despues ya no hace el setTimeout ni la funcion que trae dentro, para las demas vueltas al ciclo

Que sera el problema?
  #8 (permalink)  
Antiguo 26/11/2007, 09:03
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: SetInterval y SetTimeOut, no crean el delay esperado

No lo sé a ciencia cierta, pero opino que en el evento onreadystatechange utilizas la variable ajax y eso es lo que falla. No estoy seguro si dentro de esa función se podría usar this para referenciar al objeto de mejor manera o quizás la función nuevoAjax() esté también con variables globales y eso crea un problema. También veo que te sobran muchos var en el código dentro del bucle, y que la variable i es bastante importante ponerle var para que no se mezcle con otras i en otras funciones (quizá sea eso¿?).

También has puesto en el bucle <= 16, teniendo en cuenta que el número de elementos del array compos es 16, el último i intentará compos[16], lo que dará undefined... hay bastantes cosas bailando en el código.

Cuando te pasen cosas de este tipo, lo mejor es empezar con un ejemplo básico:
Código PHP:

// escribir en el documento una ristra (x)html fuera de tiempo de ejecución.
function e(q,sinBR) {
    var 
elDIV document.createElement("DIV");
    if(
q==undefinedq="";
    if(!
sinBRq+="<br/>";
    
elDIV.innerHTML q;
    for(var 
a=0elDIV.childNodes.length>aa++) {
        
document.body.appendChildelDIV.childNodes[a].cloneNode(true) );
    }
}
// document.getElementById abreviado
function $(x) { return document.getElementById(x); }




function 
crear(){
    var 
compos=new Array("Gabinete","Tarjeta Madre","Procesador","Memorias RAM","Disco Duro","Monitor","Tarjeta de Video","Unidad Optica","Segunda Unidad Optica","Tarjeta de Sonido","Bocinas","Disquet","Tarjetas de Memoria","Raton y Teclado","Sistema Operativo","Energia");
    var 
tiemp=0tiempotres = [];
    for(var 
i=0primargsegunargi<compos.lengthi++){
        
primarg=compos[i]+",1";
        
segunarg=compos[i];
        
tiempotres[i]=setTimeout("cambiar('"+primarg+"','"+segunarg+"', '')",tiemp) ;
        
tiemp+=2000;
    }
}


function 
cambiar(nombre,ide,tipo){
    
/*
    var ajax=nuevoAjax();
    ajax.open("GET", "recibir.php?nombre="+nombre+"&ide="+ide+"&tipo="+ tipo+"", true);
    ajax.onreadystatechange = function() {
        if (ajax.readyState==1){
            // Mientras carga elimino la opcion "Elige pais" y pongo una que dice "Cargando"
            document.getElementById(ide).innerHTML="<center><i mg src=loading.gif /></center>";
        }
        if (ajax.readyState==4) {
            document.getElementById(ide).innerHTML=ajax.respon seText;
        }
    }
    ajax.send(null);
    */
    
e("Se ha llamado a cambiar('"+nombre+"', '"+ide+"', '"+tipo+"')");
}



crear(); 
Y a partir de ahí vas creando el objeto ajax, pruebas, luego haces el open(), vuelves a probar, luego estableces el manejador del evento, pruebas de nuevo... hay que crear poquito a poco que si no detectar el error es imposible (más aún cuando se van superponiendo errores y eso es imposible de controlar).


Un saludo, y con calma.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #9 (permalink)  
Antiguo 01/12/2007, 14:07
 
Fecha de Ingreso: febrero-2005
Mensajes: 626
Antigüedad: 19 años, 2 meses
Puntos: 10
Re: SetInterval y SetTimeOut, no crean el delay esperado

Gracias por ayudarme tanto, y aunque ya funciona bien, en el internet Explorer dice en la barra de estado que hay un error y que lo que esta dentro del getElementById es nulo o no es un objeto y aunque define la variable como un objeto aun asi da el mismo error ¿Habria un error en realidad? y como lo podria solucionar?

Disculpa si por no poner tanto codigo no puse donde se hace el XMLHTTPREQUEST


Código PHP:
function nuevoAjax()

    
/* Crea el objeto AJAX. Esta funcion es generica para cualquier utilidad de este tipo, por
    lo que se puede copiar tal como esta aqui */
    
var xmlhttp=false
    try 
    { 
        
// Creacion del objeto AJAX para navegadores no IE
        
xmlhttp=new ActiveXObject("Msxml2.XMLHTTP"); 
    }
    catch(
e)
    { 
        try
        { 
            
// Creacion del objet AJAX para IE 
            
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
        } 
        catch(
E) { xmlhttp=false; }
    }
    if (!
xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp=new XMLHttpRequest(); } 

    return 
xmlhttp

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 01:36.