🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: chile.comp.programacion
Article #8

Re: Javascript: setTimeout() dentro de un objeto

#8
From: Jos� Miguel Santib��ez
Date: Wed, 05 Aug 2009 14:31
102 lines
5241 bytes
En el cap�tulo anterior (news:h5akva$k5e$1@news.nivel5.cl), Marious
<sinspam@tampocoexiste.ivn.cl> dijo: 

> On 08/04/2009 07:08 PM,  wrote:
>> En el capítulo anterior (news:h5a9b5$is5$1@news.nivel5.cl), Marious
>> <sinspam@tampocoexiste.ivn.cl>  dijo:
>>
>>> Tengo un objeto con dos funciones, una que crea un div, y
>>> otra que le aumenta el alto de 5 en 5 hasta llegar a 20
>>> (osea 4 veces).-
>>>
>>> objeto =
>>>       {
>>>       sumar: 5,
>>>       pasos: 4,
>>>       crearDiv: function()
>>>            {
>>>            this.elDiv = document.createElement('div');
>>>            // aquí se pone cualquier codigo para
>>>            // darle estilos y añadirlo a algún otro elemento
>>>            },
>>>       agrandarDiv: function()
>>>            {
>>>            if (!this.tamanno) this.tamanno = 0;
>>>            this.pasos   -= 4;
>>>            this.tamanno += this.sumar;
>>>            this.elDiv.style.height = this.tamanno+'px';
>>>            if (this.pasos != 0) setTimeout(this.agrandarDiv,100);
>>>            // Ahí está el drama ↑
>>>            }
>>>       }
>>>
>>> Si llamo a la función de agrandarDiv inmediatamente, funciona a
>>> la perfección... no así con un “setTimeout”.
>>>
>>> Necesito usar setTimeout porque quiero una demora de 100ms entre
>>> cada suma para que así se vea aparecer el div.
>>>
>>> El problema es que al hacer un setTimeout, la función no se
>>> llamará en el mismo contexto, sino fuera, y “this”
>>> perderá su valor original... osea, la referencia al objeto de la
>>> función. 
>>>
>>> Lo que busco, es una solución para poder realizarlo,
>>> pero con las siguientes reglas.
>>>
>>> No utilizar el nombre estatico del objeto.
>>> No utilizar ID para referirse al div.
>>> No registrar una variable global que haga referencia al objeto.
>>> Que me permita cambiar el nombre del objeto y no haya que
>>> tocar el codigo de este.
>>>
>>
>> A ver, no hay una solución que responda bien a todos tus
>> requerimientos. Simplemente, porque la función SetTimeOut no es una
>> función "orientada a objetos".
>>
>> Lo más cercano a lo que quieres, (y que se amarra de un pequeño
>> resquicio legal que dejaste abiero) es utilizar una variable global,
>> que sea un "arreglo" a los objetos. Algo así como:
>> var misobjetos = new Array();
>> objeto =
>>       {
>>       sumar: 5,
>>       pasos: 4,
>>       crearDiv: function()
>>            {
>>            this.indice = misobjetos.length;
>>            misobjetos[this.indice] = this;
>>            this.elDiv = document.createElement('div');
>>            // aquí se pone cualquier codigo para
>>            // darle estilos y añadirlo a algún otro elemento
>>            },
>>       agrandarDiv: function()
>>            {
>>            if (!this.tamanno) this.tamanno = 0;
>>            this.pasos   -= 4;
>>            this.tamanno += this.sumar;
>>            this.elDiv.style.height = this.tamanno+'px';
>>            if (this.pasos != 0)
>>              setTimeout(misobjetos[this.indice].agrandarDiv, 100);
>>            }
>>       }
>>
> 
> Sigue estando de cierta forma en contra de la tercera regla que puse.
> xD He googleado hasta el cansancio y nadie lo ha hecho como quiero,
> al parecer es como dices, simplemente el setTimeout no está hecho
> para trabajar dentro de objetos.
> 
> De todas formas gracias a tu sugerencia... encontraré una forma de
> manejar arreglos de objetos sin que choquen entre ellos. (no debe
> ser complicado)
> 

ehh... me queda una soluci�n que cumple con todos tus requerimientos, 
pero que es absurda: simplemente esperar dentro de un ciclo...

-- 
                           Jose M. Santiba�ez A.
                             <jms@nivel5.cl>
                           <http://caos.cl/jms>
Technical Details
Message-ID: <Xns9C5E6AFE2FC83jmsnews@200.54.144.211>
Path: arc1-ca.pugleaf.net!g2news2.google.com!news2.google.com!npeer01.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!news.glorb.com!news2.glorb.com!news-xfer.nntp.sonic.net!news.kjsl.com!news.nivel5.cl!news.tie.cl!not-for-mail
References: <h5a9b5$is5$1@news.nivel5.cl> <Xns9C5DC2A5539ADjmsnews@200.54.144.211> <h5akva$k5e$1@news.nivel5.cl>

Show Full Headers
Complete Article Headers
X-Google-Thread: 5075a5d0e4,6a8c59e449cbbab
X-Google-Attributes: gid5075a5d0e4,public,usenet
X-Google-NewGroupId: yes
X-Google-Language: SPANISH,ASCII
Path: arc1-ca.pugleaf.net!g2news2.google.com!news2.google.com!npeer01.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!news.glorb.com!news2.glorb.com!news-xfer.nntp.sonic.net!news.kjsl.com!news.nivel5.cl!news.tie.cl!not-for-mail
From: "Jos� Miguel Santib��ez" <jms@nivel5.cl>
Newsgroups: chile.comp.programacion,chile.comp.internet,chile.comp.www
Subject: Re: Javascript: setTimeout() dentro de un objeto
Date: Wed, 5 Aug 2009 14:31:15 +0000 (UTC)
Organization: Caos Consultores
Lines: 102
Message-ID: <Xns9C5E6AFE2FC83jmsnews@200.54.144.211>
References: <h5a9b5$is5$1@news.nivel5.cl> <Xns9C5DC2A5539ADjmsnews@200.54.144.211> <h5akva$k5e$1@news.nivel5.cl>
NNTP-Posting-Host: 201-236-156-151.adsl.tie.cl
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
X-Trace: jagger.tie.cl 1249482675 14467 201.236.156.151 (5 Aug 2009 14:31:15 GMT)
X-Complaints-To: news@jagger.tie.cl
NNTP-Posting-Date: Wed, 5 Aug 2009 14:31:15 +0000 (UTC)
User-Agent: Xnews/5.04.25
X-Face: +|NgjgFM{<rs%\Q|vUu16]a6,}?MJTA<!PEEI+x&Gw-Gyq+?$}fvo+.(,-r;)~Qzn)#{{nxU,OT?w^s<7m4ckCJ*L$c#I)yHL7b)GdU*#l