2013-06-13 24 views
5

Ho una funzione per ottenere alcuni dati e la funzione dovrebbe restituire una promessa. Nella funzione, devo fare 2 richieste - una dopo l'altra. Ho finito con una chiamata di deferrer nidificata in cui l'ultima chiamata resolves sul deferrer restituirà la funzione. Sono nuovo di questa roba differita e mi chiedo se questa è la soluzione giusta.Come gestire le chiamate posticipate jquery nidificate

function getData(func) { 
    var model = new Model(); 
    var collection = new Collection(); 
    var dfd = new jQuery.Deferred(); 

    collection.fetch().then(function() { 
     model.fetch().then(function() { 
      dfd.resolve(collection); 
     }); 
    }); 

    return dfd.then(function (collection) { 
     return getViews(func(collection), model); 
    }); 
} 
+0

forse ho trovato un bug con la tua domanda e la risposta accettata. Entrambi i codici restituiscono getViews() all'interno del callback .then(). È importante concettualmente capire che la funzione getData() restituisce il valore .then() rinviato, NON il getView() posticipato. Il ritorno di getViews() non sta facendo nulla qui. Se hai altro codice usando questo getData(), come le chiamate aggiuntive .then(), non ti sarà garantito che le getView saranno complete. Hai solo la certezza che avrà iniziato. Vedi il problema? Solo qualcosa di cui essere a conoscenza. – jcbelanger

+0

Quindi restituire '$ .when(). Done()' una soluzione qui? –

+0

@ cereal77killer, la tua affermazione che "il ritorno di getViews() non sta facendo nulla qui" è (da jQuery 1.8) errato. Il 'return' interno è incluso espressamente per fare in modo che la promessa restituita da' getData() 'si comporti nel modo in cui si desidera. In altre parole, se dovessi concatenare '.then()' alla promessa restituita da 'getData()', ** sarà ** garantito che 'getViews()' è completo. Se non mi credi, leggi il paragrafo che inizia "A partire da jQuery 1.8" [qui] (http://api.jquery.com/deferred.then/). Usando '.done()' darebbe il comportamento che si cerca molto correttamente di evitare. –

risposta

5

Andreas, vedo che hai correttamente accettato la risposta di Vitaliy e non sto cercando di rubare i suoi punti ma nel caso non lo sai, non è necessario creare e risolvere il tuo $.Deferred() e non è necessario passare collection intorno (eccetto a func()) come rimane nell'ambito.

Per quanto mi riguarda posso dire dal codice in questione, il seguente dovrebbe funzionare:

function getData(func) { 
    var collection = new Collection(); 
    var model = new Model(); 
    return $.when(collection.fetch(), model.fetch()).then(function() { 
     return getViews(func(collection), model); 
    }); 
} 
5

Se l'ordine delle chiamate non importa Vorrei suggerire di utilizzare http://api.jquery.com/jQuery.when

Con when è possibile effettuare richieste XHR parallele.

Problemi correlati