Ajax request no se me ejecuta en el orden correcto.

Iniciado por CryNoF, 10 Noviembre 2017, 20:41 PM

0 Miembros y 1 Visitante están viendo este tema.

CryNoF

Hola!

Estoy programando en EXTJS y estoy teniendo un problema con un Ajax Request. Sucede que el orden de su ejecucion no permite validar algunas cosas posteriormente.

Ejemplo:

Llamo los parametros al archivo guardar_avance.php (deje el IF vacio para no alargar el codigo).








El problema es que se ejecuta el Ajax Request, y al momento de llegar al success no entra en el, sino que salta al codigo de abajo , o sea al IF, y luego vuelve al inicio del Ajax Request, y al final de todo vuelve al success y si ingresa a él.

Esto me produce problemas cuando necesito ejecutar codigo despues del ajax, (por ejemplo el IF), que me comprueba q sucedio con la variable guardarRemuneracionOk , pero al saltarse el success en la primera ejecucion, este IF se invalida y no me sirve (ya que al saltarse el succes me deja en false la variable guardarRemuneracionOk ), entonces cuando ejecuta el IF la pilla falsa, y cuando si entra al success y la deja en true, ya no vuelve a comprobar con el IF.


En otras palabras, lo que esta dentro del sucess se ejecuta al final de todo, incluso despues de el if que comprueba lo dentro del success, por ende, la comprobacion del IF, queda invalidada.

Como puedo arreglar ese orden para q el success entre antes del IF?

muchas gracias!!

#!drvy

Es un problema de lógica, no de código. AJAX es  Asynchronous javascript And XML o lo que es en español: javascript asíncrono y XML. La palabra clave es asíncrono. Quiere decir que se ejecuta a dispar con los demás eventos.

En tu caso, el IF y en general todo lo que tengas que hacer con lo que devuelva el request (success), lo tendrás que hacer dentro de la propia función success o en su defecto y lo aconsejable, dentro de un callback.


Código (javascript) [Seleccionar]
success: function(resp, request)
{
    var respuestaRenumeracion = txt.util.JSON.decode(resp.responseText);
    comprobarParametros(respuestaRenumeracion);
}

// ......

function comprobarParametros(resp){
//      if()....
}


Saludos

CryNoF

Gracias drvy!, el problema es que no es solo el unico ajax request que tengo.

En el codigo real yo tengo 3 Ajax request correlativos, y cada vez que entra a al success de cada ajax, asigna una variable como true. Una vez que se ejecutan los 3 Ajax, debieran haber 3 variables con valor true, que estas variables son comprobadas en el if de este modo.



Entonces si hay algun ajax que no entro al success dara falso e identificara cual es dando el mensaje, pero el problema es que se ejecutan los Ajax pero no los success, por ende no se convierten las variables en true, y quedan en false, de ahi se ejecuta el if mandandome los mensajes de error, y despues de eso se ejecutan los success asignando trues, pero ya no me sirve por que no vuelve a pasar por el IF.





Este es el orden en que se ejecutan las acciones segun los console.log que puse en cada success y cada IF


antes de entrar

ENTRO A MENSAJE DE ERROR PERSONAL
ENTRO A MENSAJE DE ERROR DEPENDENCIA
ENTRO A MENSAJE DE ERROR REMUNERACION

ENTRO A SUCCESS PERSONAL
ENTRO A SUCCESS REMUNERACIONES
ENTRO A SUCCESS DEPENDENCIA

Que mas podria hacer??

Muchas gracias!

engel lex

estás completamente desvariando sobre el concepto... ya #!drvy te dijo... Asincrono, es decir, no se hace en sincronía

CitarLa voz sincronía (del griego syn, "con", "juntamente", "a la vez"; y Χρόνος; véase Chronos o Khronos o Cronos, "tiempo"; en latín, Chronus) alude a una coincidencia en el tiempo o a la simultaneidad de hechos o fenómenos.

si necesitas que se haga algo al completar los 3, debes hacer un concentrador o debes hacerlas encadenadas

concentrador

global data1, data2, data
3

peticion1.succes(concentrador(1, data))
peticion2.succes(concentrador(2, data))
peticion3.succes(concentrador(3, data))

concentrador(n, data){
  if n es 1 -> data1 = data
  if n es 2 -> data2 = data
  if n es 3 -> data3 = data

  if no_vacio(data1) y no_vacio(data2) y no_vacio(data3){
    realizar_evento_sincrono()
  }
}


encadenada


peticion1.succes(funcion(){
  peticion2.succes(funcion(){
    peticion3.succes(funcion(){
      realizar_evento_sincrono()
    })
  })
})

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

CryNoF

Muchas gracias por sus recomendaciones, pero viendo el ejemplo no se me ocurre como podria aplicarlo a mi codigo.

Como podria hacerlo, o bien, a que corresponde cada parte?, como por ejemplo, la data, o el concentrador?

Algun ejemplo de como ordenar mi codigo en dicha estructura?

Les agradezco :D

Un abrazo!

engel lex

En general al hablar de ajax hablas de cosas asíncronas y raramente se usas esas técnicas, deberías plantearte que tu código haga una llamada en lugar de 3 separadas dependientes de orden
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

CryNoF

Gracias engel lex, lo habia pensado asi en un principio, lo que sucede es que es un formulario que contiene 3 pestañas, cada una es una sección diferente, por lo que por la gran cantidad de campos y grillas se me hacia tedioso y confuso crear una sola consulta que me trajera todos los datos de todas las pestañas al ser consultada en un PHP, por lo que lo dividi en 3 json, cada uno con una consulta que trae los datos correspondientes a cada pestaña. Por dicho motivo tengo 3 ajax request, y mi idea era verificar cuando era el momento en que habia un error al guardarse una pestaña especifica e identificarla, pero como es asincronico, no puedo establecer un orden ni saber que peticion terminara ultimo para luego asi comprobar cual fallo despues de todo el proceso.

Pense en un momento poner la comprobacion dentro del success de la ultima pestaña, pero hay veces que si termina ultimo, y otras veces ese success se ejecuta de los primeros, y ahi tengo el drama.

Vere como puedo solucionar el tema, puesto que rediseñar el codigo se me haria muy tedioso.