jQuery / Ajax - $ .ajax () Parameter an Rückruf übergeben - Gutes Muster?

73

JavaScript-Code Ich beginne mit:

function doSomething(url) {  
   $.ajax({
      type: "GET",  
      url: url,  
      dataType: "xml",  
      success: rssToTarget  
   });  
}    

Muster, das ich verwenden möchte:

//where elem is the target that should receive new items via DOM (appendChild)
function doSomething(url, elem) {
   $.ajax({
      type: "GET",
      url: url,
      dataType: "xml",
      success: rssToTarget(elem)
   });
}  

Ich glaube nicht, dass ich den Rückruf so zum Laufen bringen kann, oder? Was ist das richtige Muster? Ich möchte nicht unbedingt globale Variablen verwenden, um den elemNamen oder elem vorübergehend zu speichern.

BuddyJoe
quelle
stackoverflow.com/questions/2602981/… benutze invokedata
Roman Rhrn Nesterov
Zum späteren Nachschlagen: Sie müssen die Rückruffunktion ( rssToTarget) in der successEigenschaft des Objektliteral speichern, an das Sie übergeben $.ajax(), damit jQuery diese Funktion aufrufen kann, sobald die AJAX-Anforderung abgeschlossen ist. Durch Hinzufügen (elem)am Ende des Funktionsnamens wird rssToTargetder Rückgabewert fälschlicherweise aufgerufen und darin gespeichert success. In JS wird durch Hinzufügen von Klammern am Ende eines Funktionsnamens dieser aufgerufen.
BrunoFacca

Antworten:

96

So was...

function doSomething(url, elem) {
  $.ajax({
     type: "GET",
     url: url,
     dataType: "xml",
     success: function(xml) {
       rssToTarget(xml, elem);
     }
  });
}

Antwort auf Ihren Kommentar: Beeinträchtigt die Verwendung anonymer Funktionen die Leistung?

Josh Stodola
quelle
3
aha +1. Zahlen Sie einen Leistungspreis für die Erstellung von Anon-Funktionen überall?
BuddyJoe
2
Und ich denke, es wäre wirklich ... Erfolg: function (xml) {rssToTarget (xml, elem); }
BuddyJoe
Wenn Sie Ihren $.ajaxAufruf in eine Schleife einschließen, erstellt dieser Ansatz function(xml) { ... }für jede Schleife eine neue Funktion ( ), die mehr Speicherplatz beansprucht.
stack247
30

Das Muster, das Sie verwenden möchten, könnte funktionieren, wenn Sie einen Abschluss in Ihrer rssToTarget-Funktion erstellen:

function rssToTarget(element) {
  return function (xmlData) {
    // work with element and the data returned from the server
  }
}

function doSomething(url, elem) {
    $.ajax({ type: "GET",
         url: url,
         dataType: "xml",
         success: rssToTarget(elem)
       });
}

Bei der rssToTarget(elem)Ausführung wird der Elementparameter im Abschluss gespeichert und die Rückruffunktion wird zurückgegeben, die darauf wartet, ausgeführt zu werden.

Christian C. Salvadó
quelle
-1 Sie können den Erfolg einer Funktion nicht festlegen, die eine Funktion zurückgibt.
Josh Stodola
Ich habe vergessen hinzuzufügen "aber erfordert einen Parameter"
Josh Stodola
3
Natürlich können Sie eine Funktion zurückgeben, um den laufenden Code zu überprüfen! jsbin.com/anepo/edit
Christian C. Salvadó
3
Die zurückgegebene anonyme Funktion hat einen Eingabeparameter ... JavaScript-Funktionen ermöglichen es Ihnen, dies und mehr mit Funktionen zu tun ...
Christian C. Salvadó
1
Diese Antwort gibt genauer wieder, was das OP erreichen wollte, als die akzeptierte Antwort.
sage88