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);
});
}
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
Quindi restituire '$ .when(). Done()' una soluzione qui? –
@ 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. –