2013-06-13 12 views
5

Mam funkcję, aby uzyskać pewne dane, a funkcja powinna zwrócić obietnicę. W funkcji muszę wykonać 2 żądania - jedna po drugiej. Skończyło się to zagnieżdżonym połączeniem odroczenia, w którym ostatnie wywołanie resolves na odroczeniu funkcji powróci. Jestem nowy w tym odroczonym materiale i zastanawiam się, czy to właściwe rozwiązanie.Jak obsłużyć zagnieżdżone jquery odroczone połączenia

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

może Znalazłem błąd z pytaniem i zaakceptowanej odpowiedzi. Oba kody zwracają getViews() wewnątrz wywołania zwrotnego .then(). Ważne jest, aby zrozumieć, że funkcja getData() zwraca wartość .then(), a nie odkładanie getView(). Zwracanie getViews() nic tu nie robi. Jeśli masz inny kod przy użyciu tej funkcji getData(), takiej jak dodatkowe wywołania .then(), nie będziesz mieć gwarancji, że getViews będzie kompletny. Masz tylko gwarancję, że to się zacznie. Widzisz problem? Po prostu coś, o czym należy pamiętać. – jcbelanger

+0

Czy powracałoby tu rozwiązanie '$ .when(). Done()'? –

+0

@ cereal77killer, twoje stwierdzenie, że "zwrócenie getViews() nic tutaj nie robi" jest (z jQuery 1.8) niepoprawne. Wewnętrzny "return" jest zawarty w sposób wyraźny, aby obietnica zwrócona przez 'getData()' zachowała się tak, jak chcesz. Innymi słowy, jeśli miałbyś łańcuch '.then()' do obietnicy zwróconej przez 'getData()', ** będziesz mieć gwarancję, że 'getViews()' jest kompletny. Jeśli mi nie wierzysz, przeczytaj akapit zaczynający się od "Jak z jQuery 1.8" [tutaj] (http://api.jquery.com/deferred.then/). Użycie '.done()' dałoby zachowanie, którego bardzo poprawnie unikasz. –

Odpowiedz

5

Andreas, widzę, że całkiem dobrze przyjąłeś odpowiedź Vitaliy'a i nie próbuję kraść jego punktów, ale na wypadek, gdybyś nie był świadomy, nie ma potrzeby tworzenia i rozwiązywania własnego $.Deferred() i nie ma potrzeby, aby przejść collection wokół (z wyjątkiem func()), ponieważ pozostaje w zakresie.

O ile mogę powiedzieć z kodu w pytaniu, co następuje powinno działać:

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