2012-10-15 14 views
7

Ho le seguenti funzioni che vengono richiamate ogni 2 secondi per caricare alcuni dati. Registra la funzione [do] per fare le cose con la risposta. (l'esempio è semplificato).Ascoltare una funzione che si chiami JavaScript

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

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

mi chiedo se non v'è alcun modo che io possa creare una funzione che viene chiamata ogni volta che la funzione [fare] viene chiamato con le necessità di aggiungere una chiamata per l'ascoltatore all'interno della funzione fare. Grazie in anticipo. Se c'è un modo migliore per farlo con jquery, come un plugin, apprezzerei l'aiuto.

[Modifica] L'idea non è se funziona o no. La mia domanda riguardava la possibilità di aggiungere un listener personalizzato alla funzione "do" che era già stata implementata. Qualcosa come addActionListener ("do", "after", doSomeThingElse) Così potrei fare qualcos'altro appena terminata la funzione do.

+1

'2000' = 2 secondi non 2 minuti. Quello che hai in setInterval è milli secondi .. Questo è solo un commento –

+3

Non nominare la funzione 'do'. 'do' è una parola riservata in Javascript. –

+1

E a proposito, per gli argomenti di 'setInterval' devono essere capovolti - la funzione viene prima, quindi i millisecondi: https://developer.mozilla.org/en-US/docs/DOM/window.setInterval – Ian

risposta

5

Se si desidera mantenere il codice esistente, come lo è, si potrebbe avvolgere do() in un'altra funzione, che a sua volta chiama do() e la vostra nuova funzione (diciamo do_this_as_well()).

Vedere l'esempio di seguito (ho rinominato do() in do_this() per evitare confusione attorno alla parola chiave riservata do). Funziona perché le funzioni globali non sono altro che variabili con oggetti funzione in esse.Queste variabili possono essere sovrascritte, in questo caso con una nuova funzione che chiama quella precedente:

function do_this(response) { ... } 

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

Stai sovrascrivendo la prima funzione e avvolgendo la stessa vecchia funzionalità in una nuova con l'azione che dovrei chiamare; manterrebbe il riferimento dal callback ajax? – jaxkodex

+0

Difficile dire che senza sapere cosa stai facendo esattamente, tu dici che il tuo esempio è semplificato. Ma se si passa un singolo parametro di risposta, questo parametro verrà inoltrato. –

+0

Ho capito che lo sovrascriverà, e l'esempio (dato che è lì) funzionerà chiamando la funzione'do_questo 'quando mai la richiesta di ajax ha successo. Fa senso, specialmente da quando hai aggiunto il perché. ho capito bene? – jaxkodex

1

Sostituire

con

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

Quindi, non c'è modo di aggiungere un listener a quella funzione già integrata? – jaxkodex

+0

Capisco. Suppongo che potresti eseguire il comando do() in un'altra funzione, che funzionerebbe come un listener, ma JavaScript non fornisce in modo nativo ciò che desideri. –

+0

Suppongo che la soluzione, quindi, sarebbe quella di modificare il callback di successo dalla richiesta Ajax. C'è un modo per farlo in runtime (non posso cambiare il codice) - Grazie per la risposta, a proposito. – jaxkodex

6

In primo luogo, la versione semplificata non funziona, perché avresti bisogno di passare alla funzione do invece di chiamarla.

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

Ma sembra che tu stai chiedendo come eseguire qualche altro codice ogni volta do viene richiamato.

Se do viene richiamato solo all'interno della funzione doRequest(), quindi è sufficiente aggiungere il altro codice per una funzione anonima che richiama do al momento giusto.

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

Se si vuole che sia più generalizzata, è possibile creare una funzione di decoratore che restituisce una funzione che invoca do dopo qualche altro codice.

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

quindi rendere le funzioni in questo modo:

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

Se la vostra esigenza è più specifica di un pre-trattamento dei response, si potrebbe rielaborare in questo modo:

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

Quindi modificare fn e restituire response.

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

Tipo di tentativo di lavorare con lo stesso codice, quindi la mia domanda era più sull'aggiunta di un "eventListener" – jaxkodex

+0

@jaxkodex: Per quanto riguarda la tua modifica, no non puoi modificare direttamente 'do' * (almeno senza qualche hackish' .toString() 'e' eval' tricks) * o associare qualche evento alla sua invocazione. Ma puoi * facilmente * impacchettare 'do' in un'altra funzione che fa un altro lavoro. Ci sono diversi approcci a questo. –

Problemi correlati