2009-01-09 12 views
5

Mi página trata de muchos objetos de "Tienda", cada uno de ellos tiene un campo llamado 'datos'. Sin embargo, estos datos se obtienen a través de solicitudes AJAX que pueden estar sucediendo paralelamente.¿Cómo hacer que jQuery pase argumentos personalizados a funciones de devolución de llamada asíncrona AJAX?

function Store(id){ 
    this.id = id; 
    this.queryparam = 'blah'; 
    this.items = null; 
} 

Store.prototype.fetch = function(){ 
    $.get("/get_items",{q:this.quaryparam},function(data,status){ 

     // how to store the received data in this particular store object? Being 
     // a callback function, I don't have a reference to this object as 'this' 

     // this.data = data; //will not work 
    }); 
} 

En la función de devolución de llamada He intentado definir un parámetro por defecto de los objetos que llaman de la siguiente manera:

$.get("/get_items",{q:this.quaryparam},function(data,status, ref = this) ... 

Pero resulta que Javascript no es compatible con parámetros por defecto de este tipo. ¿Puedo de alguna manera obtener jquery para pasar una referencia a 'esta' tienda en la función de devolución de llamada?

pensé en un par de otros enfoques, pero ninguno de ellos trabajan:

pude configurar los datos del almacén mediante solicitudes síncronas pero eso no es el punto de AJAX, ¿verdad?

Otra forma para mí podría ser enviar la identificación de la tienda también en las solicitudes que aparecerán en la respuesta. Por ejemplo:

// in Store.fetch() 
$.get("/get_items",{q:this.quaryparam,id:this.id},function(responsetext,status){ 
    var response = eval(responsetext); 
    stores[response.id].data = response.data; 
}); 

no me gusta este enfoque porque esto contamina la respuesta sólo porque el código del lado del cliente no pudo hacer un seguimiento de qué solicitud fue enviada por qué objeto.

Además, dado que store.id es específico del cliente, también se ensucia el almacenamiento en caché en el servidor. Se usará una URL de solicitud diferente para dos tiendas diferentes aunque tengan los mismos parámetros de consulta.

¿Hay alguna otra manera de lograr lo que quiero?

Respuesta

5

Usted debe ser capaz de utilizar el cierre:

var tmp = this; 
$.get("/get_items",{q:this.quaryparam},function(data,status){ 
    tmp.data = data; 
}); 

es eso lo que quiere decir?

2

función Almacenar (id) { this.id = id; this.queryparam = 'blah'; this.items = null; }

Store.prototype.fetch = function(){ 
    var that = this; 
    $.get("/get_items",{q:this.quaryparam},function(response){ 
     that.callback(response) 
    }); 
} 

Store.prototype.callback = function(response){ 
    // and here you can use 
    this.items = response // just example 
} 
0

Parece estar funcionando, aunque no entiendo cómo se puede acceder a la variable 'tmp' dentro de la función anónima. :-)

Gracias Marc y ricardoe!

+1

Esto es lo que hace de cierre. Google para "cierre" y "alcance léxico": estos son conceptos importantes para comprender en JavaScript. –

Cuestiones relacionadas