2009-07-28 2 views
73

JavaScript-Code Ich beginne mit:

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

Muster Ich mag würde verwenden:

//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 bekommen kann auf diese Weise zu arbeiten, nicht wahr? Was ist das richtige Muster? Ich möchte nicht unbedingt globale Variablen verwenden, um vorübergehend den elem oder elem Namen zu halten.

+0

http://stackoverflow.com/questions/2602981/jquery-how-to-pass-additional-parameters-to-success-callback-for-ajax-call Verwendung aufgerufenen Daten –

+0

Für zukünftige Referenz: Sie müssen die speichern Callback-Funktion ('rssToTarget') innerhalb der' success' -Eigenschaft des Objektliterals, die Sie an '$ .ajax()' übergeben, so dass jQuery diese Funktion aufrufen kann, sobald die AJAX-Anfrage abgeschlossen ist. Durch Hinzufügen von '(elem)' am Ende des Funktionsnamens rufen Sie irrtümlicherweise 'rssToTarget' auf und speichern ihren Rückgabewert in' success'. In JS wird das Hinzufügen von Klammern am Ende eines Funktionsnamens dazu führen. – BrunoFacca

Antwort

94

So ...

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

Antwort auf Ihren Kommentar: Does use of anonymous functions affect performance?

+3

aha +1. Bezahlen Sie einen Leistungspreis für die Erstellung von anon-Funktionen überall? – BuddyJoe

+2

Und ich denke, es wäre wirklich .... Erfolg: Funktion (xml) {rssToTarget (xml, elem); } – BuddyJoe

+0

Wenn Sie einverstanden sind, können Sie die Antwort aktualisieren? Danke Josh – BuddyJoe

30

Das Muster, das Sie arbeiten könnte verwenden möchten, wenn Sie einen closure in Ihrem 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) 
     }); 
} 

Wenn rssToTarget(elem) ausgeführt wird, wird der Elementparameter im closure gespeichert und die Callback-Funktion ist return ned und wartet darauf, ausgeführt zu werden.

+0

-1 Sie können Erfolg nicht auf eine Funktion setzen, die eine Funktion zurückgibt. –

+0

Ich habe vergessen hinzuzufügen "aber erfordert einen Parameter" –

+3

natürlich können Sie eine Funktion zurückgeben überprüfen Sie den Code läuft! http://jsbin.com/anepo/edit – CMS