• Publicidad (ayudanos a mantener el Foro haciendo un click sobre la misma)
  • Cuixer, una forma de administrar páginas web que nunca viste!

Esperar la respuesta de Ext.Ajax.request ???

Foros generales de ayuda Ext 3.0.

Ext.foro.Nuevo
Mensajes: 5
Registrado: 25 Ene 2012, 06:02
NotaPublicado: 25 Ene 2012, 06:25
Hola, tengo un problema con Ext.Ajax.request,y esel siguiente:

desde una funcion javaScript llamo a un ASP que crea un registro en una tabla de la BBDD mediante Ext.Ajax.request y devuelvo un ID del registro que acabo de crear con un insert, y la respuesta que obtengo en el success, debo escribirla en un textbox.

Parece sencillo, pero me encuentro con el problema que el success me devuelve 'undefined', ya que el Ajax.request NO SE ESPERA A QUE EL ASP DEVUELVA LA RESPUESTA.
Es decir: el ajax.request me retorna antes de obtener respuesta del ASP.

Lo que necesito es:

1.- llamar a la funcion Ext.Ajax.request pasandole una URL de ASP.
2.- Que el ASP haga un insert en la bbdd y luego escriba el ID del registro que acaba de insertar
3.- Que el success del Ajax.request me devuelva ese ID
4.- Escribir ese ID en un textbox.

Adjunto código:

FUNCION DEL AJAX.REQUEST:
Código: Seleccionar todo
var execAjax= function(urlX,devolver){
    Ext.Ajax.request({
     method: 'GET',
     url: urlX,
     timeout: 6000,
     success: function( resp ){
                if (devolver=='true') {
                  alert('voy a devolver: ' +resp.responseText);
                  return resp.responseText;
            }
      
        },
     failure: function() {
         alert('Ha ocurrido un error, intente de nuevo.');
        }
     })
}

FUNCION QUE LLAMA A LA FUNCION DEL AJAX.REQUEST (En esta función ponemos la respuesta del Ajax.request en un textbox llamado "idPeticioX":
Código: Seleccionar todo
function GrabacabeceraFirma()
{

   var url = "http://miserver.com/ass/grabacabecerafirma.asp?nombre=AAAA";

   document.getElementById("idPeticioX").value=execAjax(url,'true');

}

LLAMADA A LA FUNCION PRINCIPAL:
GrabacabeceraFirma();

ASP QUE ES LLAMADO DESDE AJAX Y DEVUELVE UN ID QUE DEBO GUARDAR EN UN TEXTBOX:
Código: Seleccionar todo
<%
nombre1=request.querystring("nombre")

SQL="insert into tabla (nombre) values (' " & nombre1 & " ')"
Conexion.execute SQL

SQL="select ID from tabla order by nombre desc;"
resultado=Conexion.getRecordSet SQL

response.write resultado

%>

NOTAS: He de decir que el ASP que pongo aquí está simplificado, pero la respuesta que retorna por sí solo es correcta. Es decir: si llamo a este ASP desde el navegador directamente ponendo la URL en la barra de direcciones: "http://miserver.com/ass/grabacabecerafirma.asp?nombre=AAAA", lo que recibo es: 12465

Ese número 12465 es el ID que debo guardar en el textbox.

Lo digo porque el error no está en el ASP. De hecho, al cabo de un rato de pasar por success, me aparece un alert que pone: "voy a devolver: 12465". La lástima es que ya es demasiado tarde, ya que seguidamente de esa llamada a Ext.Ajax, hago más llamadas a otras funciones con el valor del textbox, donde lamentablemente el success ya me ha llenado con un 'undefined'.

Entonces, mi problema es que NO SÉ COMO HACER PARA QUE EL SUCCESS ME DEVUELVA LA RESPUESTA DEL ASP. NECESITO QUE ESPERE A QUE EL ASP DEVUELVA EL VALOR DEL ID DE LA BBDD.

¿Puede alguien ayudarme por favor? Despues de buscar en un montón de foros y en sencha-com, no logro encontrar respuesta!

Gracias de antemano y saludos.
Última edición por tokkaido el 25 Ene 2012, 17:06, editado 1 vez en total
Razón: el código debe estar entre etiquetas CODE para facilitar al lectura (^_^)
Para no ver esta publicidad, debes ser usuario del Foro.
Publicidad (ayudanos a mantener el Foro haciendo un click sobre la misma)


Cuixer, una forma de administrar páginas web que nunca viste!

Avatar de Usuario
Ext.foro.Moderador
Mensajes: 353
Registrado: 17 Ago 2009, 12:06
NotaPublicado: 25 Ene 2012, 17:12
la respuesta del ajax debe venir en formato JSON y luego debes decodificarla en el lado del cliente por ejemplo en el lado del servidor
Código: Seleccionar todo

{"success": true, "valor":"mi respuesta"}



y el success del ajax puedes usar

Código: Seleccionar todo
           respuesta = Ext.decode(resp.responseText);
           this.my_componente.update(respuesta.valor);


espero te ayude (^_^)

Ext.foro.Nuevo
Mensajes: 5
Registrado: 25 Ene 2012, 06:02
NotaPublicado: 26 Ene 2012, 05:16
Ah! así que JSON no es sólo para recibir datos de bases de datos? Yo lo uso para llenar un grid leyendo datos de una bbdd, pero no sabía que se puede utilizar para cualquier cosa!

Probaré lo que me dices, y... ¿crees que así coneseguiré que se espere a obtener la respuesta del server?

Gracias!
Avatar de Usuario
Ext.foro.Moderador
Mensajes: 353
Registrado: 17 Ago 2009, 12:06
NotaPublicado: 26 Ene 2012, 08:25
Recuerda que al ser asincronico el codigo siempre seguira "de largo". La unica forma que tienes para controlar que algo sucede cuando quieras que suceda o que un valor exista antes de que se ejcute cierta funcion es hacer la llamada a la funcion dentro del success del ajax, por ejemplo si tienes una ventana cuyo titulo lo necesitas llamar desde el lado del servidor la llamada o la creacion de tu ventana deberá estar en el success
Avatar de Usuario
Ext.foro.Moderador
Mensajes: 353
Registrado: 17 Ago 2009, 12:06
NotaPublicado: 26 Ene 2012, 10:49
mira, este trozo de codgio que tienes nunca va a resultar como quieres

Código: Seleccionar todo
document.getElementById("idPeticioX").value=execAjax(url,'true');


porque el ajax no funciona como una funcion normal, tu funcion execAjax ya habrá pasado de largo mucho antes de que ajax regrese el dato que quieres, una posible solución seria:

Código: Seleccionar todo
var execAjax= function(urlX,devolver){
    Ext.Ajax.request({
     method: 'GET',
     url: urlX,
     timeout: 6000,
     success: function( resp ){
                if (devolver=='true') {
                     document.getElementById("idPeticioX").value=resp.responseText;                 
               }
     
        },
     failure: function() {
         alert('Ha ocurrido un error, intente de nuevo.');
        }
     })
}

function GrabacabeceraFirma()
{

   var url = "http://miserver.com/ass/grabacabecerafirma.asp?nombre=AAAA";

   execAjax(url,'true');

}


espero te sirva (^_^)

Ext.foro.Nuevo
Mensajes: 5
Registrado: 25 Ene 2012, 06:02
NotaPublicado: 31 Ene 2012, 08:39
Hola tokkaido!

ante todo, muchas gracias por tu respuesta!

tu última respuesta me ha confirmado que iba por buen camino, ya que yo también he llegado a esa conclusión.

Pero me temo que eso no ha sido suficiente.

Al final, he tenido que añadir una comprobación ala función que se ejecuta después, y en total el código ha quedado de la siguiente forma:

Código: Seleccionar todo
function execAjax (urlX,msg_ok,msg_err,devolver){ // definimos la funcion del boton de Signar
    Ext.Ajax.request({
     method: 'POST',
     url: urlX,
     timeout: 120000,
     callback : function(){
         //alert('he terminado');
      },
     success: function( resp ){
                if (devolver=='true') {
               //alert('voy a devolver: ' +resp.responseText);
               document.getElementById("idPeticioX").value=resp.responseText;
            }
            if(msg_ok!='') Ext.Msg.alert('OK',msg_ok);
      
        },
     failure: function() {
         if(msg_err!='') Ext.Msg.alert('Error',msg_err);
        }
     })
}


Código: Seleccionar todo
function GrabacabeceraFirma()
{

var url = "http://miserver.com/ass/grabacabecerafirma.asp?nombre=AAAA";

   execAjax(url,'true');
}


FUNCION QUE SE DEBE LLAMAR UNA VEZ DEVUELTO EL VALOR DEL AJAX.REQUEST:

Código: Seleccionar todo
var enProceso = false; // lo usamos para ver si hay un proceso activo

function sign(accion) {
   //Hasta que no tengamos el idpeticio del ajax, no podemos tirar p'alante
   if (document.getElementById("idPeticioX").value!='') {
      enProceso=false;
   }else{
      enProceso=true;
   }

   if (enProceso) {
          //Si estoy procesando la petición de Ajax, espero 100ms y vuelvo a intentarlo.
          //Así sucesivamente hasta que haya obtenido la respuesta de Ajax.request.
       fn = "sign('" + accion + "')";
       setTimeout(fn, 100);
   } else {

   //Hago todas las acciones, una vez que ya tenemos el valor de retorno de ajax.request....

   }
}


Otro dato importante es que en la funcón "execAjax" he puesto un timeout=120000 ms, (2 minutos), ya que si la respuesta del server por lo que fuera tardaba un poco mas de 6000 ms (el valor que tenía antes, que son como 0,1 segundos), la función terminaba antes de tiempo sin esperar la respuesta del server! --> Esto también me ha parecido muy importante.

No sé si ésta es la mejor forma de hacerlo, pero desdeluego que sí funciona...

De todas formas, si alguien tiene alguna sugerencia para hacerlo "bien", estaré encantado de escucharla!

Muchas gracias y saludos.

Volver a Ext 3.0: Ayuda





  • Publicidad (ayudanos a mantener el Foro haciendo un click sobre la misma)
  • Cuixer, una forma de administrar páginas web que nunca viste!