🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: chile.comp.programacion
Article #9

Re: Javascript: setTimeout() dentro de un objeto

#9
From: Marious
Date: Wed, 05 Aug 2009 15:13
102 lines
5471 bytes
On 08/05/2009 10:31 AM,  wrote:
> 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...
>

Esa dejaría pegado al navegador seguramente...
Ya dí con una buena.-
Simplemente menciono el nombre del objeto una vez más dentro de sus
variables, y lo paso a las funciones como argumento.
Technical Details
Message-ID: <h5c7jt$q42$2@news.nivel5.cl>
Path: arc1-ca.pugleaf.net!g2news2.google.com!news1.google.com!news.glorb.com!news.kjsl.com!news.nivel5.cl!not-for-mail
References: <h5a9b5$is5$1@news.nivel5.cl> <Xns9C5DC2A5539ADjmsnews@200.54.144.211> <h5akva$k5e$1@news.nivel5.cl> <Xns9C5E6AFE2FC83jmsnews@200.54.144.211>

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,UTF8
Path: arc1-ca.pugleaf.net!g2news2.google.com!news1.google.com!news.glorb.com!news.kjsl.com!news.nivel5.cl!not-for-mail
From: Marious <sinspam@tampocoexiste.ivn.cl>
Newsgroups: chile.comp.programacion,chile.comp.internet,chile.comp.www
Subject: Re: Javascript: setTimeout() dentro de un objeto
Date: Wed, 05 Aug 2009 11:13:12 -0400
Organization: Varios
Lines: 102
Message-ID: <h5c7jt$q42$2@news.nivel5.cl>
References: <h5a9b5$is5$1@news.nivel5.cl> <Xns9C5DC2A5539ADjmsnews@200.54.144.211> <h5akva$k5e$1@news.nivel5.cl> <Xns9C5E6AFE2FC83jmsnews@200.54.144.211>
NNTP-Posting-Host: nat.stockergroup.com
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
X-Trace: news.nivel5.cl 1249485245 26754 200.73.16.136 (5 Aug 2009 15:14:05 GMT)
X-Complaints-To: news@news.nivel5.cl
NNTP-Posting-Date: Wed, 5 Aug 2009 15:14:05 +0000 (UTC)
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b3pre) Gecko/20090513 Fedora/3.0-2.3.beta2.fc11
In-Reply-To: <Xns9C5E6AFE2FC83jmsnews@200.54.144.211>