Foros del Web » Programando para Internet » Jquery »

closure for y ajax en uno solo

Estas en el tema de closure for y ajax en uno solo en el foro de Jquery en Foros del Web. Hola genios!!! pego la funcion primero y cuento luego Código: for(var i=0; i<te.length; i++){ var nom=(te[i].getAttribute('id')); var cual; var id_idioma = document.getElementById("campo"+nom).value; var motivo = ...
  #1 (permalink)  
Antiguo 17/10/2013, 05:41
 
Fecha de Ingreso: mayo-2008
Mensajes: 224
Antigüedad: 16 años, 7 meses
Puntos: 4
closure for y ajax en uno solo

Hola genios!!!

pego la funcion primero y cuento luego
Código:
 
for(var i=0; i<te.length; i++){
		var nom=(te[i].getAttribute('id'));
		var cual;
		var id_idioma = document.getElementById("campo"+nom).value;
		var motivo = document.getElementById("campo"+nom).value;
		var moneda = document.getElementById("campo"+nom).innerHTML;
		var precio = document.getElementById("campo"+nom).value;
		var dataString='tipoBusqueda=6&idOfer='+ultimo+'&idioma='+id_idioma+'&motivo='+motivo+'&moneda='+moneda+'&precio='+precio;
        var resu = function(){
		      $.ajax({
         				 type: "POST",
			       		 url: "mots/pOfic.php",
						 data: dataString,
						 success: function(data) {
						 cual=data;
						                          }					  
					   })
				return cual;	
				};
		console.log("resu,"+resu); 		
				
 }//cierro for
Bien, no funciona.
El var resu muestra la funcion como texto, no ejecuta.
les cuento. el for contabiliza unos div creados dinamicamente, mientras los cuenta envia de a uno a ajax. si ajax vuelve con error debera cortar el for de lo contrario continuaria.
El punto crucial es que for es sincronico y ajax es asincronico ( o al reves ) y por ende el for no espera respuesta de ajax y sigue su marcha. Para cuando llega ajax con la respuesta el for apago la luz cerro la puerta y puso candado .
Leyendo por la web me encuentro en la solucion de closure........

Bien, dentro de mi ignorancia entendi un poquitin pero se ve que no del todo porque algo en la funcion estoy haciendo mal.

El break no lo puse todavia porque no logro hacer que ejecute la segunda funcion.

Alguna idea antes de que me internen
  #2 (permalink)  
Antiguo 17/10/2013, 07:30
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 4 meses
Puntos: 1532
Respuesta: closure for y ajax en uno solo

no puedes hacerlo así porque AJAX es asincrono, debes reemplazar el for por una función recursiva que se llame a sí misma dentro del onreadystatechange (success para jQuery)
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 17/10/2013, 18:57
 
Fecha de Ingreso: mayo-2008
Mensajes: 224
Antigüedad: 16 años, 7 meses
Puntos: 4
Respuesta: closure for y ajax en uno solo

Hola mayco.

Quizas no te entendi bien, pero seguimos con el dilema de los divs.

El for esta para contabilizar los div y que al mismo tiempo me vaya dando los valores para ir enviando a ajax.

Si no tengo un bucle para buscar los divs, nunca voy a saber cuantos mandar ni que mandar. Al menos que haya otra forma ademas de for while y $.each() que no conosco.

Las funciones recursivas que estuve viendo durante el dia, como para ir aprendiendo un poco su funcionalidad trabajan sobre el valor devuelto de una funcion, pero no logro enlazar ese procedimiento sobre la contabilizacion de los divs, porque las funciones arrancan con un valor hasta otro valor y ahi es donde no los se hasta que un bucle lo averigue. Y te repito no solo averiguar sino darme los datos para cada envio.

Y ya que estas aprovecho para preguntarte. Segun lo que lei comentan que no es muy seguro utilizar funciones recursivas porque no todos los navegadores lo interpretan correctamente y a veces tienden a colgarse. Es esto asi?

A ver, dentro de mi capacidad diviso dos soluciones pero me gustaria que me comentaras si no hay otra o si son estas, cual de las dos da mejor versatilidad al sevidor y usuario.

Una. Usar for y guardar absolutamente todos los datos en variables array junto con una variable que guardara la cantidad de divs.
Enviar todo esto en una sola peticion ajax y realizar un bucle en php que vaya guardando los valores.

dos. Usar un for y guardar solamente los ids de los divs para localizar los datos a enviar y la cantidad de divs y ahi crear una funcion asincronica descontando cada devolucion correcta sobre el valor inicial.

que opinas?
  #4 (permalink)  
Antiguo 18/10/2013, 08:27
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 4 meses
Puntos: 1532
Respuesta: closure for y ajax en uno solo

asumí que en te.length ya tenias el total que necesitabas, así que no entiendo que quieres hacer, en principio te habría recomendado acumular todo en una sola petición ajax, pero implica cambios al nivel del servidor.

el problema con las funciones recursivas es que, si no están controladas pueden llegar a desbordar la pila de procesos (el clásico StackOverflowException), pero claro, te recomendé ello porque asumí como límite te.length, por lo cual era poco probable que ocurriera.

si puedes explicar que es lo que esperas de dicha petición AJAX sería más fácil orientarte.
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...

Última edición por maycolalvarez; 18/10/2013 a las 08:43
  #5 (permalink)  
Antiguo 18/10/2013, 17:30
 
Fecha de Ingreso: mayo-2008
Mensajes: 224
Antigüedad: 16 años, 7 meses
Puntos: 4
Respuesta: closure for y ajax en uno solo

tal cual. en te.lenght tengo todos los valore encontrados.
Te paso en limpio lo que intento hacer desde el principio.

es una pagina multidioma.
La pagina cuando abre, carga hace una peticion ajax buscando todos los idiomas habilitados.
Como no se con exactitud cuantos habra, porque eso depende del usuario, genero unos divs los cuales identifico con el codigo del idoma y en el contenido del div genero un imput en donde el usuario guardara un valor dependiendo el idioma.

Esto lo hago con jquery.append();
Ejemplo que genero en el resultado del ajax:
<div id='idiomArt"+data[index].id_idioma+"' name='cajaIdiomasArticulos' class='cajaArtN lisCajaPro redondear2'><div align='right' class='Tex1'>Nombre:&nbsp;</div><input type='text' class='paraCaja' id='nomProducto"+data[index].id_idioma+"' name='frmNuevoAr' /><div>

Te lo acorte un poquito porque tiene mas cosas.

En estos div el usuario debera ingresar el nombre del producto por cada idioma, osea hay una caja por idioma.

Aca comienza el dilema. Para guardar estos datos debo recorrerlos de alguna manera, for, while $each para poder contabilizar cada uno y obtener el id de cada div.

Cuando hago el bucle realizo los siguiente:
obtengo el id completo del div
realizo un substr para tomar el indice del idioma que seria el data[index].id_idioma.
busco todos los valores en los imputs (son varios) que contengan ese codigo de idioma.
esta busqueda no la hago con bucle, directamente uso document.getElementById("nomProducto"+codigoIdioma ).value;
envio los datos a ajax
respuesta correcta continuo el bucle
respuesta incorrecta cierro bucle y muestro motivo.

Por supuesto no funciona. como nos llevo a la conversacion inicial, el bucle no espera, el ajax se envia sin problemas, pero tengo que preveer que si hay algun salto o algo en el servidor, el usuario este enterado que sus datos no fueron guardados por x motivo.

Investigue un poco otras opciones como hacer un array con todos los valores pero tendria que generar un array por cada imput, que son varios por cada div, ademas de no saber con exactitud cuantos divs seran porque como te dije antes todo depende del usuario y para el moño del regalito hay dos que no son imputs sino texarea y si no lei mal hay un tope para pasar valores por array.

Te puedo pasar una imagen de la pagina como la veria el usuario pero no se como enviartela

El asunto no es repetir ajax porque si hago una repeticion de ajax sigo enviando los mismos valores, por eso dependo del bucle para que pase al siguiente div y vuelva a tomar los nuevos valores y ahi volver a enviar ajax.

Etiquetas: ajax, funcion, html, javascript, php
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 17:29.