2009-11-12 5 views
5

ho questo javascript:jQuery passando una chiamata di funzione attraverso un'altra funzione e l'ordine di esecuzione

triggerAnimation(listItem,toggleToggleRadioListItem(listItem)); 


function triggerAnimation(listItem,passThruFunction){ 
    listItem.find(".inlineLoading").show(); 
// pause and then call the toggle function 
    $("body").animate({opacity: 1}, 1000, 
    function(){ 
     alert("a"); 
    passThruFunction; 
    } 
    ); 
} 

function toggleToggleRadioListItem(listItem) { 
    alert("b"); 
}; 

Cosa è supposta:

  • triggerAnimation è chiamato passaggio di un oggetto e una funzione
  • triggerAnimation fa un'animazione fittizia (per creare una pausa), poi solleva un avviso e attiva una funzione di callback, che esegue la funzione che è stato passato attraverso.
  • la funzione che è stato passato attraverso viene chiamato alzando un avviso.

Sulla base di quanto sopra, mi aspetto che l'avviso A venga visualizzato prima dell'allarme B, ma non è questo il caso. Quello che succede è che (sembra) l'avviso B viene chiamato non appena viene chiamato triggerAnimation(). Perché? Come posso ottenere quel comportamento?

risposta

6

È possibile ritardare l'esecuzione passando una funzione e richiamandola in un secondo momento.

triggerAnimation(listItem, function() { 
    toggleToggleRadioListItem(listItem) 
}); 


function triggerAnimation(listItem,passThruFunction){ 
    listItem.find(".inlineLoading").show(); 
// pause and then call the toggle function 
    $("body").animate({opacity: 1}, 1000, 
    function(){ 
     alert("a"); 
     passThruFunction(); 
    } 
    ); 
} 

function toggleToggleRadioListItem(listItem) { 
    alert("b"); 
}; 
+0

Questa è una bella soluzione, lo ammetto. – fresskoma

+0

era esattamente mia intenzione! Grazie! E 'stato un errore di sintassi da parte mia non averlo passato come funzione nella prima chiamata (come afferma Cesar, sembra che la stavo chiamando, piuttosto che passarla) –

1

Perché si chiama toggleToggleRadioListItem(listItem) quando si chiama triggerAnimation(listItem,toggleToggleRadioListItem(listItem));, quindi viene eseguito prima toggleToggleRadioListItem(listItem).

2

Bene, è possibile passare il riferimento alla funzione e una serie di parametri per attivare invece l'animazione, che viene quindi passata a passThruFunction all'esecuzione. in JavaScript, che cosa si passa ad una funzione sarà sempre essere valutati prima che il codice funzione viene effettivamente eseguito, questo è il motivo per cui si ottiene il vostro avviso ("b") prima. Questo è chiamato valutazione occupata [dei parametri funzione], btw.

1

eduffy's risposta è la più semplice possibile cosa che potrebbe funzionare, e funziona a meraviglia. Se vuoi qualcosa di più hardcore, una lettura tranquilla di partial application potrebbe darti un'altra tecnica da aggiungere al tuo cinturone.