Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/12/2013, 03:16
DoHITB
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 1 mes
Puntos: 33
Valores "apilados" me dan error

Buenas,

Tengo una función recursiva en JavaScript, que es llamada varias veces desde otra, creando una pila de llamadas (llego a contar 17 como máximo, lo que no debería ser problema).

Os dejo un "snippet" de mis funciones:

La llamada "inicial" es esta (por ejemplo: fill(new Array("uno", "dos", "tres"), doc);

Código Javascript:
Ver original
  1. this.fill=function(currnode,doc){
  2.         for(i1=0;i1<currnode.length;i1++){
  3.             this.treat(doc.getElementsByTagName(currnode[i1]),currnode[i1]);
  4.         }
  5.  
  6.         return this.check();
  7. };


La función treat:
Código Javascript:
Ver original
  1. this.treat=function(nl,kindnode){
  2.         for(i2=0;i2<nl.length;i2++){
  3.             this._add(nl.item(i2), kindnode);
  4.         }
  5. };

la función _add (un ejemplo):

Código Javascript:
Ver original
  1. this._add=function(n,kind){
  2.         if(kind=="uno"){
  3.                 this.add(new Array("one", "two", "five", "ten"), n.childNodes, "uno", false);
  4.         }else if(kind=="dos"){
  5.                 this.otraFuncion(n);
  6.         }else if(kind=="uno:one"){
  7.                 this.add(new Array("pera", "manzana", "tomate", "sandía"), n.childNodes, "comida", true);
  8.         }else if(kind=="comida:pera"){
  9.                 this.tratarFruta(n.firstChild.nodeValue);
  10.         }
  11. };

Finalmente, "add":
Código Javascript:
Ver original
  1. this.add=function(fields,e,space,deep){
  2.                 for(i5=0;i5<fields.length;i5++){
  3.                         for(j=0;j<e.length;j++){
  4.                                 if(e.item(j).nodeName==fields[i5]){
  5.                                         if(deep){
  6.                                                 this._add(e.item(j).firstChild, space+":"+fields[i5]);
  7.                                         }else{
  8.                                                 this._add(e.item(j), space+":"+fields[i5]);
  9.                                         }
  10.  
  11.                                         break;
  12.                                 }
  13.                         }
  14.                 }
  15.         };

Esto en JAVA me servía como "parser" de XML perfectamente... pero en JS tengo el siguiente problema:

como habéis visito, cada bucle tiene un índice específio (iX) ya que si todos eran "i" el valor de "i" se mantenía, por lo que el siguiente bucle no empezaba por 0. Esta parte es un poco "parche de caca" pero es una solución rápida.

El problema grande me viene (de momento) con "this.add".

Si la primera llamada tiene como parámetro (por ejemplo) un array de 5 posiciones, y la segunda llamda (quedando la primera en la pila, entiendo) tiene un array de 3 posiciones, pasa algo como:

Llamada 1: i5 = 0
Llamada 1: i5 = 1
(put Llamada 1)
Llamada 2: i5 = 0
Llamada 2: i5 = 1
(put Llamada 2)
otraFuncion
[...]
(pop Llamada 2)
Llamada 2: i5 = 2
Llamada 2: i5 = 3
(pop Llamada 1)
Llamada 1: i5 = 3
(debería ser i5 = 1)

Y entonces me va saltando items porque no me recupera el valor como si tuviese apiladas las llamadas...

¿Alguien sabe qué puedo hacer?

Gracias!