2009-01-09 2 views
5

Meine Seite beschäftigt sich mit vielen "Store" -Objekten, jedes von ihnen hat ein Feld namens "Daten". Diese Daten werden jedoch über AJAX-Anfragen abgerufen, die möglicherweise parallel laufen.Wie erhält man jQuery, um benutzerdefinierte Argumente an asynchrone AJAX-Callback-Funktionen zu übergeben?

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 
    }); 
} 

In der Callback-Funktion, die ich wie folgt einen Standardparameter auf die Aufruf Objekte versucht zu definieren:

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

aber stellt sich heraus, dass Javascript nicht Standardargument Werte wie diese nicht unterstützt. Kann ich irgendwie bekommen, dass jquery in der Callback-Funktion einen Verweis auf 'diesen' speichert?

Ich dachte an ein paar andere Ansätze, aber keiner von ihnen arbeiten:

ich die Speicherung von Daten über synchrone Anfragen einstellen könnte dann aber das ist nicht der Punkt von AJAX ist es?

Eine andere Möglichkeit für mich könnte sein, die Store-ID auch in den Anfragen zu senden, die in der Antwort zurückkommen werden. Für zB:

// 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; 
}); 

Ich mag diesen Ansatz nicht, weil dies die Antwort verpestet, nur weil der clientseitigen Code konnte nicht den Überblick zu behalten, welche Anforderung durch welches Objekt gesendet wurde.

Darüber hinaus, da store.id Client-spezifisch ist, wird es auch Caching auf dem Server durcheinander bringen. Eine andere Anforderungs-URL wird für zwei verschiedene Speicher verwendet, obwohl sie dieselben Abfrageparameter haben.

Gibt es eine andere Möglichkeit zu erreichen, was ich will?

Antwort

5

Sie sollten in der Lage sein Schließung zu verwenden:

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

Ist das, was Sie meinen?

2

Funktion Speichern (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

Scheint zu arbeiten, obwohl ich nicht verstehe, wie die Variable 'tmp' innerhalb der anonymen Funktion zugänglich ist. :-)

Danke Marc und Ricardoe!

+1

Dies ist, was Schließung tut nützlich sein wird. Google für "closure" und "lexical scope" - das sind wichtige Konzepte in JavaScript zu verstehen. –

Verwandte Themen