var done = this.async()
e done(blah)
è un trucco intelligente per restituire un valore prelevato dalla chiamata asincrona (ad esempio $.get
) all'interno di una funzione sincrona.
Vediamo un esempio:
var getText = function() {
return "hello";
};
var text = getText();
Si tratta di una chiamata di funzione piuttosto semplice in modo che nessuno di puzzle qui. Tuttavia, cosa succede se è necessario recuperare il testo in modo asincrono nella funzione getText()?
var getText = function() {
return $.get('<some-url>', function(text) {
return text;
}); // ??????
};
chiamata a getText()
non restituisce il testo che si desidera ottenere. Restituisce l'oggetto di promessa di jquery.
Quindi, come possiamo rendere getText()
restituire il testo ricevuto dalla chiamata $.get()
?
var getText = function() {
var done = this.async();
$.get('<some-url>', function(text) {
done(text);
});
};
var text = getText(); // you get the expected text
Magico, giusto?
Non conosco ancora il funzionamento interno della chiamata this.async()
. Non so se c'è una libreria che fornisce quella funzione, ma puoi vedere che Backbone.LayoutManager usa questo trucco https://github.com/tbranyen/backbone.layoutmanager/blob/master/backbone.layoutmanager.js (cerca this.async).
Inoltre, Tim Branyen (l'autore di backbone layoutmanager) ne parla brevemente nel suo video tutorial (http://vimeo.com/32765088 circa 14:00 - 15:00). Nel video, Tim dice che Ben Alman ha escogitato quel trucco. Date un'occhiata anche a questo https://github.com/cowboy/javascript-sync-async-foreach
Penso che sia un trucco abbastanza accurato per mixare funzioni asincrone e sincronizzazione.
Cheers,
fonte
2012-11-02 04:59:21
Questa non è una funzione incorporata. Deve essere fornito da qualche libreria/framework. – user123444555621