2012-03-20 46 views
6

He escrito una función que realiza una solicitud asíncrona utilizando jQuery.Devolución de llamada asincrónica

var Site = { 

    asyncRequest : function(url, containerId) {   
     $.ajax({ 
      url : url, 
      onSuccess: function(data){ 
       $(containerId).html(data); 
      } 
     }); 
    } 
} 

La sintaxis puede ser un poco incorrecta ya que estoy usando el bloc de notas, pero ojala tenga la idea.

que llama a la función:

Site.asyncRequest('someurl', container1); 
Site.asyncRequest('someurl', container2); 

Ambas solicitudes enviadas y procesadas por el servidor. Se devuelven dos respuestas, que es lo que espero. Sin embargo, esperaría que container1 y container2 contengan respuestas de ambas solicitudes.

El problema es que solo se muestra la última respuesta y no puedo entender por qué. No sé cómo jQuery ajax lleva un registro de solicitudes/respuestas, así que tal vez esto sea un problema.

Digamos que realizo 5 o 10 solicitudes, ¿cómo sabe jQuery ajax qué respuesta hay para cada solicitud y dónde la mantiene?

Gracias

+0

Hola, gracias. Podría intentar pasar una función como parámetro y luego llamar a esa función desde OnSuccess. Veré si puedo hacer que eso funcione. Mi principal preocupación es que no puedo depurar fácilmente y hacer un seguimiento de lo que está sucediendo. –

Respuesta

5

Esto parece ser un problema de ámbito Javascript. Pruebe lo siguiente:

var Site = { 
    asyncRequest: function(url, containerId) { 
     (function(theContainer) { 
      $.ajax({ 
       url: url, 
       onSuccess: function(data) { 
        $(theContainer).html(data); 
       } 
      }); 
     })(containerId); 
    } 
}; 

Esto crea un ámbito separado para cada llamada a la función, por lo que el valor real a la que apunta "theContainer" es diferente para cada función anónima onSuccess.

+0

@SheikhHeera, ese no es el caso, en realidad, por una razón algo oscura: el método '' .ajax'' está usando el parámetro '' url'' dentro del evento actual del bucle de evento mientras '' containerId''/'' El valor de TheContainer'' se está utilizando en otro evento más adelante en el bucle de evento. Como Javascript es un único hilo, es imposible que el parámetro '' url'' sea diferente de lo que pretendíamos que fuera. Solo tendríamos que cambiar el alcance de '' url'' si la función '' onSuccess'' necesita hacer uso de él. –

1

Lo que ocurre aquí es un único cierre se está creada, debido a la forma en que se declaró que la función. Consulte "Un ejemplo más avanzado" aquí: http://skilldrick.co.uk/2010/11/a-brief-introduction-to-closures/

Básicamente, el containerId se está compartiendo entre todas las instancias de esa función anónima onSuccess. No he probado esto, pero creo que si definió su función asyncRequest fuera de Site, esto funcionaría.

En cuanto a una solución más elegante a este problema, quizás alguien más responda mejor.

Cuestiones relacionadas