2012-10-15 29 views
7

Mam następujące funkcje, które są wywoływane co 2 sekundy w celu załadowania niektórych danych. Rejestruje on funkcję [zrobić], aby zrobić rzeczy z odpowiedzią. (przykład jest uproszczony).Posłuchaj funkcji o nazwie JavaScript

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

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

Zastanawiam się, czy istnieje jakikolwiek sposób, że mogę utworzyć funkcję, która jest wywoływana za każdym razem, gdy funkcja [zrobić] nazywa się z konieczności dodać wywołanie do słuchacza wewnątrz funkcji zrobić. Z góry dziękuję. Jeśli istnieje lepszy sposób na zrobienie tego przy pomocy jquery, na przykład wtyczka, byłbym wdzięczny za pomoc.

[Edytuj] Pomysł nie zależy od tego, czy działa, czy nie. Moje pytanie dotyczyło tego, czy mogę dodać niestandardowego detektora do funkcji "do", która została już zaimplementowana. Coś jak addActionListener ("do", "after", doSomeThingElse) Więc mógłbym zrobić coś innego zaraz po zakończeniu funkcji do.

+1

'2000' = 2 sekundy nie 2 minuty. To co masz w setInterval to milli sekund. To jest tylko komentarz. –

+3

Nie nadawaj swojej funkcji 'do'. 'do' jest słowem zastrzeżonym w JavaScript. –

+1

A tak przy okazji, dla argumentów 'setInterval' należy odwrócić - funkcja jest pierwsza, następnie milisekundy: https://developer.mozilla.org/en-US/docs/DOM/window.setInterval – Ian

Odpowiedz

5

Jeśli chcesz zachować istniejący kod, jak to jest, można owinąć do() w innej funkcji, która z kolei wywołuje do() i swoją nową funkcję (słownie do_this_as_well()).

Zobacz przykład poniżej (zmieniłem nazwę na do() na do_this(), aby uniknąć nieporozumień wokół zastrzeżonego słowa kluczowego do). Działa to, ponieważ funkcje globalne są niczym innym jak zmiennymi z obiektami funkcji w nich.Zmienne te można zastąpić, w tym przypadku nową funkcją, która wywołuje starą:

function do_this(response) { ... } 

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

Przekonujesz pierwszą funkcję i wykręcisz tę samą starą funkcjonalność w nowej funkcji z akcją, którą powinienem wywołać; czy zachowałby referencję z wywołania ajaxowego? – jaxkodex

+0

Trudno powiedzieć, nie wiedząc, co dokładnie robisz, mówisz, że twój przykład jest uproszczony. Ale jeśli przekażesz pojedynczy parametr odpowiedzi, ten parametr zostanie przekazany dalej. –

+0

Zrozumiałem, że to go zastąpi, a przykład (tak jak tam jest) zadziała, wywołując funkcję'do_this ', gdy żądanie ajax zakończy się pomyślnie. To sprawia, że ​​szczególnie dlatego, że dodałeś dlaczego. czy mam to prawo? – jaxkodex

1

Wymień

z

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

Więc, nie ma sposobu, aby dodać słuchacza do tej już wbudowanej funkcji? – jaxkodex

+0

Rozumiem. Przypuszczam, że można zawijać funkcję do() w innej funkcji, która działałaby jak słuchacz, ale JavaScript nie zapewnia natywnie tego, czego oczekujesz. –

+0

Domyślam się, że rozwiązaniem byłoby zmodyfikowanie wywołania zwrotnego sukcesu z żądania ajax. Czy jest jakiś sposób to zrobić w czasie wykonywania (nie mogę zmienić kodu) - Dziękuję za odpowiedź przy okazji. – jaxkodex

6

Po pierwsze, uproszczona wersja nie będzie działać, bo trzeba by przekazać funkcję do zamiast nazywając ją.

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

Ale to brzmi jak pytasz jak uruchomić jakiś inny kod za każdym razem do jest wywoływany.

Jeśli do wywoływana jest tylko wewnątrz funkcji doRequest(), wtedy wystarczy dodać inny kod do anonimowej funkcji, która wywołuje do w odpowiednim czasie.

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

Jeśli ma to być bardziej uogólniony, można utworzyć dekorator funkcję zwracającą funkcję, która wywołuje do po jakimś innym kodem.

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

następnie dokonać funkcje tak:

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

Jeśli wymóg jest bardziej szczegółowy od wstępnego przetwarzania response, można przerobić go tak:

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

Następnie zmodyfikuj i zwiąż .

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

Trochę próbuję pracować z tym samym kodem, więc moje pytanie było bardziej o dodawaniu "eventListener" – jaxkodex

+0

@jaxkodex: Odnośnie twojej edycji, nie możesz bezpośrednio modyfikować 'do' * (przynajmniej bez jakiegoś hackish' .toString() 'i' eval' triicks) * lub wiążą pewne zdarzenie z jego wywołaniem. Ale możesz * łatwo * zawijać 'do' w innej funkcji, która wykonuje inną pracę. Istnieje kilka podejść do tego. –

Powiązane problemy