Comunidad de diseño web y desarrollo en internet online

Envio varias vece variables POST con AJAX

Citar            
MensajeEscrito el 01 Jul 2014 12:47 pm
Tengo el siguiente codigo:

Código :

function call(page,par4) {
   
   url = page;
      var parametres="saludo="+par4;
      http.open("POST", url,true);
      http.onreadystatechange = tracePage;
      http.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
      http.send(parametres);page='';
}
function tracePage() {
   if (http.readyState == 4) {
      if (http.status == 200) {
         
         }}}

i luego tengo el siguiente codigo:

Código :

for(var d=0;d<a7.length;d++){call("zu.php",nvo);}


El envio de datos necesito que sea tipo post el problema es que a menos que le añada un alert dentro del bucle solo me envia una sola vez i el ultimo elemento de for, en cambio si le pongo un alert me enviara cada variable nvo. Alguien sabe como solucionar esto?

Por aukun

Claber

200 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 01 Jul 2014 03:08 pm
Es por que el proceso es asincrono, es decir procesa la peticion del for, manda la variable POST, pero no se espera a recibir una respuesta... y continua.

Lo mismo pasa n cantidad de veces y por ello solo te regresa la ultima, por que es la que termina el ciclo y ahora si se espera a que devuelva una respuesta tu petición por que ya no le queda de otra :)

La respueseta malecha, es hacer la peticion Sincrona, o colocar una funcion que espere el resultado antes de continuar con la petición.

Aquí un ejemplo de como solucionarlo:

http://www.mattlunn.me.uk/blog/2011/11/handling-an-ajax-response-in-javascript-with-or-without-jquery/

Saludos

Por elporfirio

Claber

652 de clabLevel

1 tutorial

Genero:Masculino  

FullStack Web Developer

firefox
Citar            
MensajeEscrito el 01 Jul 2014 03:20 pm
Olvide la respuesta copy paste.. seria algo similar a esta:

Código Javascript :

function call(page, par4, respuesta) {
    url = page;
    var parametres = "saludo=" + par4;
    http.open("POST", url, true);
    http.onreadystatechange = function() {
        if (http.readyState==4 && http.status==200) {
            
            http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            http.send(parametres);
        
            respuesta(http.responseText);
        }    
    };
    page = '';
}

for (var d = 0; d < a7.length; d++) {
    call("zu.php", nvo, function(respuesta){
        //aqui ya interactuas con la respuesta ;)
    });
}

Por elporfirio

Claber

652 de clabLevel

1 tutorial

Genero:Masculino  

FullStack Web Developer

firefox
Citar            
MensajeEscrito el 01 Jul 2014 05:59 pm
Lo voy a probar pero de todas maneras no consigo entenderlo por el hecho que haces un http.send(parameters) cuando el http.status==200, pensaba que con esto del ajax enviabas datos cuando estos consiguen status==200 entonces creas una accion, de todas maneras me parece genial el codigo que has puesto, pero no se si me solucionara el problema, para interactuar con la respuesta fuera de la funcion call yo lo solucionaba creando una variable global tipo
window['variable respuesta']=respuesta(http.responseText); -> Pero ese no es el problema que tengo ahora
Lo que necesito es que cada vez que haga un call() el for pare hasta que status==200 entonces cuando consiga ese status entonces continuar con el bucle. Si lo que has puesto funciona!? quiere decir que cada vez que hace un call espera la confirmacion de status==200 para y entonces cuando es 200 es decir se envio correctamente entonces continua con el bucle. Lo voy a probar a ver que tal, oye gracias por la respuesta.

Por aukun

Claber

200 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 01 Jul 2014 06:35 pm
Velo asi, vas a un restaurante y pides comida.
¿ahora empiezas a comer enseguida de pedirla? .No verdad

Tienes que esperar a que envien la peticion, una vez que pase esto, hacen tu comida y tu evento de respuesta es tu comida.

Cuando recibes la comida es cuando la comes.

Sin embargo el proceso que te explique es: pides un platillo, te lo preparan, te lo traen y pides el segundo platillo, esto obviamente esta mal por que haces muchas peticiones.

PAra esto se utiliza algo que se llama promises en JS

Por elporfirio

Claber

652 de clabLevel

1 tutorial

Genero:Masculino  

FullStack Web Developer

firefox
Citar            
MensajeEscrito el 01 Jul 2014 07:06 pm
Te explico estoy haciendo un html para que los usuarios hagan paginas web, la manera de crearla es que el usuario va creando objetos que no son nada mas y nada menos que divs dragables,resizables y editables. Estos se van almacenando dentro de un array como objetos, es decir un array de objetos, estos objetos les extraigo las propiedades, por ejemplo si es un objeto de impresion solo tiene propiedad innerHTML si es una imagen solo las propiedades de la box div es decir borderWith, borderColor .... y src.A veces estos objetos tienen dentro otros objetos por ejemplo si el div(objeto) contiene <table> por lo que es necesario en algunos objetos que son enormes al pasar estas propiedades en un string codificado es necesario que se pasen estos strings por partes, de todas maneras lo tengo limitado a 35Kb por objeto con la funcion:

Código :

function LC(i,w,m){var i=I(i,w);i.onkeydown=function(e){k=(document.all)?e.keyCode:e.which;if((k==8)||(k==37)||(k==39)||(k==46)){}else{return(this.textContent.length>=m?false:true);}};}

siendo m el maximo de caracters que se puede escribir en el div.
Lo tengo a 35000 bytes porque aun estoy haciendo pruebas con otros browers y apache, y solo tengo un servidor por eso es necesario que se haga por partes el envio de datos. Cada envio codificado el php lo guarda en un fichero, tantos objetos tantos ficheros usando el mismo php. Por eso decidi hacer el envio por partes, piensa que puede que en una pagina web pueden llegar a haber varios centenares de objetos. Dicho esto cual crees tu que seria la mejor manera de proceder?

Por aukun

Claber

200 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 02 Jul 2014 06:00 am
Tal como yo pensaba no funciona. Bueno mirare de volver con lo que yo hacia y le añadire un timer a ver si me funciona

Por aukun

Claber

200 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 02 Jul 2014 06:20 am
Ya esta ya lo solucione en el open tengo que poner el async como false y me funciona bien el envio de datos me lo hace por partes(que de hecho lo que hago es sincronizar AJAX). Aunque de todas formas he leido por ahi que los envio POST no tiene limitaciones de tamaño, por lo que estoy pensando de enviar todos los datos aunque sea 1Mb puede que llegue ser una opcion para mas adelante.

Por aukun

Claber

200 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 02 Jul 2014 12:18 pm
El tercer parámetro del método open() indica si la petición debe ser asíncrona. Prueba poniendo en false ese parámetro.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 03 Jul 2014 12:08 pm
Si como ya te dije en la variable asyncr del open ya le puse el false anteriormente, de todas formas me emite la consola del firefox un mensaje de advertencia:


Un XMLHttpRequest síncrono en el hilo principal está desaprobado por sus efectos negativos en la experiencia del usuario final. Para más ayuda vea http://xhr.spec.whatwg.org/



Supongo que simplemente es un aviso para indicarme que estoy sincronizando el envio con ajax por lo que supongo que en si es una contradiccion puesto que ajax realiza un envio asincronico. Para eliminar el mensaje en la consola quise meterle console.clear(); para limpiar los avisos pero veo que no funciona. Creo que elejire enviar todos los datos juntos por POST y asincronicamente. Puesto que POST no tiene limitacion de envio de datos, y pontdre un aviso de envio de datos hasta que status ==200

Por aukun

Claber

200 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 03 Jul 2014 12:23 pm
POST no tiene límite en el navegador pero sí en el servidor. Cuidado con eso.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 03 Jul 2014 12:34 pm
Ya veo, y no se puede modificar el envio POST de bytes en el httpd.conf de apache, de todas maneras por lo que veo en las respuestas de otros foros lo que debo poner es una limitacion de objetos(que son string con propiedades de los objetos creados por el usuario) a enviar y a su vez una limitacion en esos mismos strings que representan cada uno un objeto, ya que se me podria colapsar.A ver que sucede tendre que ponerlo al limite a ver cual es el tope :evil:

Por aukun

Claber

200 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 04 Jul 2014 12:28 pm
O podrías usar Ajax asíncrono pero ejecutando una petición cuando termine la anterior y así hasta que no haya más datos para enviar.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 07 Jul 2014 09:43 am
ya lo probe pero me sigue enviando solo el ultimo call del for, como dije el for necesita parar hasta que status equivalga a 200 y luego cuando sea 200 que vuelva a continuar el for y no se como parar un for y que vuelva a correr desde la variable del bucle en que paro cuando status vuelva a ser 200. La idea seria hacer un pause en el for, teniendo en cuenta que el pause no puede ser un evento time sino un evento del tipo datos conseguidos correctamente desde servidor pues finalizamos el pause de dentro el for.

Por aukun

Claber

200 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 07 Jul 2014 09:49 am
Pero como digo, si fuera posible hacer eso lo que estaria haciendo es sincronizando los call del for mediante asincronias. Cada call seria asincronico pero entre ellos estarian sincronizados.

Por aukun

Claber

200 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 07 Jul 2014 12:27 pm
No necesitas un for. Basta con una variable global que indique cuántos se han enviado (o faltan por enviar).

Tipo...

Código Javascript :

var cont = 0;
var datos = array();

function Enviar(dato) {
  if (cont < 7) {
   Ajax.Fin = Recibido;
   Ajax.Get('procesar.php?d='+dato);
  }
}
function Recibido() {
   cont++;
   if (cont < 7) {
     Enviar(datos[cont]);
   }
}



Donde cont es la variable global que lleva la cuenta, datos es un array con los datos a enviar secuencialmente, Ajax sería tu implementación de Ajax que tiene dos métodos, uno Fin() que se ejecuta cuando la petición regresa y otro Get() que es la que ejecuta la petición.

Ya tú sabrás cómo adaptarlo a tus necesidades.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 08 Jul 2014 09:34 am
Genial, nunca habia embebido ciclicamente funciones en javascript entonces seria algo como esto:

Código Javascript :

c8=0;// para que una variable pase de una funcion a otra normalmente no le pongo var 
var da=Array('hidden,1px,solid,#cccccc,double,#ffffff,Arial,15px','hidden,2px,solid,#dcdcdc,double,#00ff00,Arial,20px');
function S1(D){
     if(c8<da.length){
          if (http.readyState==4 && http.status==200) {
               call('zu.php',D);//tiene que ejecutarse antes de R, no?
               R1();//Aqui comienza a buclear
          }else{}
     }else{/*aqui finaliza el bucleado*/}
}  
function R1(){
      if(c8<da.length){
           S1(da[c8]);
      }else{}
      c8++;
}


Una pregunta que sucede con http no tendria que poner S1(D,http) y R1(http) o lo trata como global?

Por aukun

Claber

200 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 08 Jul 2014 12:23 pm
El objeto http que estás usando debe ser global. O sea, debes declararlo fuera de toda función con var, onda:

Código Javascript :

var http = new ...

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 09 Jul 2014 04:31 pm
detallando lo de Driver OP

Código Javascript :

var soyGlobal = null;

function uno(){
    var soyLocal = "nada";
    soyGlobal = "uno";
}


Por cierto este tema lo estan extendiendo demasiado y es multitopico, favor de no hacer este tipo de contenido ya que se presta a confusión.


Saludos.

Por elporfirio

Claber

652 de clabLevel

1 tutorial

Genero:Masculino  

FullStack Web Developer

firefox
Citar            
MensajeEscrito el 10 Jul 2014 10:36 am
Si perdon tienes razon, :) solo queria saber si http siendo una variable XMLHttpRequest no fuera diferente.

Por aukun

Claber

200 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 16 Jul 2014 08:14 am
Muchas gracias al final me quedo de la siguiente manera y me funciona sin errores en el envio de datos:

Código Javascript :

var W=window;
function SP(){var o=arguments[0];var l=arguments.length;for(var j=1;j<l;j++){var a=arguments[j].split(',');o['style'][a[0]]=a[1];};}
function call(page) {
   url = page;var parametres='';if(c8==0){}else{}
   var par4=(c8==0)?' '+arguments[1]:arguments[1];
   parametres="saludo="+par4;
   http.open("POST", url,true);
   http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
   http.send(parametres);
   if(page=='zuu.php'){
   http.onreadystatechange = function() {
   if(c8<a7.length+1){
   if(http.readyState==4&&http.status==200) {
      c8++;if(c8==a7.length+1){
      var vb='[['+bc1.value+','+bc2.value+','+bc3.value+']]';
      call('zuu.php',vb);
      O(W,'avis','div','ibody');var j4=I('avis',W);
      K('avis',1,1,40,500,'orange','orange');tex('avis','<center>Dades Enviades Correctament</center>','white','Arial','30');
      SP(j4,'position,fixed','zIndex,30','borderRadius,40px','borderWidth,5px','marginLeft,50%','left,-250px','marginTop,25%');
      setTimeout(function(){elim('avis');},650);
      }else{call('zuu.php',DB(c8-1));}
      
   }else{}
   }else{}
   }
   }else{}
   
}
bo1['onclick']=function(){
if(a7.length>0){
c8=0;call('zuu.php',DB(c8));
}else{};
}; 

cuando c8==0 me hace como un doble envio de los datos en a7[0] lo cual utilizo el primer envio para hacer un clear en la base de datos del usuario para iniciar el bucle de envio de datos, el evento y las propiedades style las pongo entre [ ] para luego hacer un array de eventos y propiedades enviados por AJAX al hacer un evento window.onload de esta manera evito que en el rediseño de codigo nunca me aparezca ningun string del tipo <center>Dades Enviades Correctament</center> o ningun a.style. o a['style'] ademas que se crea una gran reduccion de codigo y ademas lo que esto hace es que si copias el codigo i lo intentas ejecutar fuera del server no aparezca absolutamente nada, porque el browser no entiende absolutamente nada fuera del server.

Por aukun

Claber

200 de clabLevel



Genero:Masculino  

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.