2012-10-15 11 views
7

Ich habe folgende Funktionen, die alle 2 Sekunden aufgerufen wird, um einige Daten zu laden. Es registriert die Funktion [do], um das Zeug mit der Antwort zu tun. (Das Beispiel ist vereinfacht).Achten Sie auf eine Funktion namens JavaScript

function doRequest(){ 
    $.ajax({ url: 'www.google.com.pe', success: function (response) {do(response)} }); 
} 

function do (text){ 
    var i = setInterval(doRequest, 2000); 
} 

Ich frage mich, ob es eine Möglichkeit ist, dass ich eine Funktion erstellen, die jedes Mal, wenn die [tun] Funktion mit aus, um aufgerufen wird aufgerufen wird einen Aufruf an die Zuhörer in der do-Funktion hinzuzufügen. Danke im Voraus. Wenn es einen besseren Weg gibt, es mit jquery zu tun, wie ein Plugin, würde ich mich über die Hilfe freuen.

[Bearbeiten] Die Idee ist nicht, ob es funktioniert oder nicht. Meine Frage war, ob ich einen benutzerdefinierten Listener zu der "do" -Funktion hinzufügen kann, die bereits implementiert wurde. Etwas wie addActionListener ("do", "after", doSomeThingElse) Also könnte ich etwas anderes tun, nachdem die do-Funktion beendet wurde.

+1

'2000' = 2 Sekunden nicht 2 Minuten. Was Sie in setInterval haben, ist Millisekunden. Dies ist nur ein Kommentar –

+3

Benennen Sie nicht Ihre Funktion 'do'. 'do' ist ein reserviertes Wort in Javascript. –

+1

Und übrigens, für 'setInterval' Argumente müssen umgedreht werden - die Funktion kommt zuerst, dann die Millisekunden: https://developer.mozilla.org/en-US/docs/DOM/window.setInterval – Ian

Antwort

5

Wenn Sie vorhandenen Code behalten möchten, wie es ist, könnten Sie do() in einer anderen Funktion wickeln die wiederum ruft do() und Ihre neue Funktion (zB do_this_as_well()).

Siehe Beispiel unten (ich habe do() in do_this() umbenannt, um Verwirrung um das reservierte Schlüsselwort do zu vermeiden). Dies funktioniert, weil globale Funktionen nichts anderes sind als Variablen mit Funktionsobjekten in ihnen.Diese Variablen können überschrieben werden, in diesem Fall mit einer neuen Funktion, die die alte aufruft:

function do_this(response) { ... } 

(function() 
{ 
    var previous=do_this; 
    do_this=function(response) { previous(response); do_this_as_well(); } 
})(); 
+0

Sie überschreiben die erste Funktion und umbrechen dieselbe alte Funktionalität in eine neue mit der Aktion, die ich aufrufen müsste; Würde es die Referenz vom Ajax Callback behalten? – jaxkodex

+0

Schwer zu sagen, ohne zu wissen, was Sie genau tun, sagen Sie, dass Ihr Beispiel vereinfacht ist. Übergeben Sie jedoch einen einzelnen Antwortparameter, wird dieser Parameter weitergeleitet. –

+0

Ich habe verstanden, dass es es überschreiben wird, und das Beispiel (wie es dort ist) funktioniert, ruft die Funktion'do_this 'auf, wenn die Ajax-Anfrage erfolgreich ist. Es macht Sinn, besonders seit du das Warum hinzugefügt hast. Habe ich es richtig verstanden? – jaxkodex

1

ersetzen

mit

success: function(response) { do(response); do_this_as_well(); } 
+0

Also gibt es keine Möglichkeit, einen Listener zu dieser bereits eingebauten Funktion hinzuzufügen? – jaxkodex

+0

Ich verstehe. Ich nehme an, Sie könnten do() in eine andere Funktion einbinden, die wie ein Listener funktionieren würde, aber JavaScript bietet nicht nativ, was Sie wollen. –

+0

Ich denke, die Lösung wäre dann, den Erfolgsrückruf von der Ajax-Anfrage zu modifizieren. Gibt es eine Möglichkeit, dies in Laufzeit zu tun (ich kann den Code nicht ändern) - Danke für die Antwort übrigens. – jaxkodex

6

Zuerst wird Ihre vereinfachte Version nicht funktionieren, weil Sie die do Funktion statt nannte es passieren bräuchten.

function doRequest(){ 
    $.ajax({ url: 'www.google.com.pe', success: _do }); 
} 

Aber es klingt wie Sie fragen, wie einige andere Code auszuführen jedes Mal do aufgerufen wird.

Wenn do wird nur innerhalb der doRequest() Funktion aufgerufen wird, dann nur Ihren anderen Code auf eine anonyme Funktion hinzufügen, die do zum richtigen Zeitpunkt aufruft.

function doRequest(){ 
    $.ajax({ url: 'www.google.com.pe', success: function(response) { 
      // Run your other code 
      // or invoke another function. 
      _do(response); 
    } }); 
} 

Wenn Sie es wollen mehr verallgemeinert werden, können Sie eine Funktion Dekorateur erstellen, die eine Funktion gibt, die do nach einem anderen Code aufruft.

function doFactory(fn) { 
    return function() { 
     fn.apply(this, arguments); 
     _do.apply(this, arguments); 
    } 
} 

dann Funktionen wie diese machen:

var doFoo = doFactory(function() { 
    console.log("foo"); 
}); 

Wenn Ihre Anforderung spezifischere einer Vorverarbeitung response ist, könnte man es so überarbeiten:

function doFactory(fn) { 
    return function(response) { 
     _do.call(this, fn.call(this, response)); 
    } 
} 

Dann die fn manipulieren und response zurückgeben.

var doFoo = doFactory(function(response) { 
    return response + "foo"; 
}); 
+0

Ich versuche, mit dem gleichen Code zu arbeiten, also war meine Frage mehr über das Hinzufügen eines "eventListener" – jaxkodex

+0

@jaxkodex: In Bezug auf Ihre Bearbeitung, nein können Sie 'do' * nicht ändern (zumindest ohne etwas hackish' .toString() 'und' eval' Tricks) * oder binden Sie ein Ereignis an seinen Aufruf. Aber du * kannst * leicht in eine andere Funktion, die etwas andere Arbeit verrichtet, "wickeln". Dafür gibt es verschiedene Ansätze. –

Verwandte Themen