2012-09-27 15 views
6

Wiem, że zalecanym sposobem użycia Dojo Deferreds jest użycie dojo.when (def) lub def.then() i zapewnienie wywołania zwrotnego w przypadku rozwiązania Odroczonego. Czasami jednak natrafiam na scenę, w której naprawdę muszę poczekać na zakończenie Odroczonego, zanim przejdę do bieżącego wątku. Oto przykład (pełna przykładów na http://jsfiddle.net/DG3Ax/2/)Jak mogę zablokować do czasu rozwiązania Dojo odroczonego?

function getSomething() { 
    var def = getSomeDeferred(); 

    def.then(function(result) { 
     dojo.place("<li>def.then() = " + result + "</li>", "output"); 
    }); 

    return def.gimmeTheResultNow(); 
} 

dojo.place("<li>getSomething() = " + getSomething() + "</li>", "output"); 

Oczywiście Deferred.gimmeTheResultNow() nie istnieje, ale to funkcjonalność szukam. Nie mam kontroli nad kodem wywołującym getSomething(), więc nie mogę zmusić go do odroczenia; potrzebuje prawdziwego wyniku.

Wiem, że xhrGet() ma parametr synchronizacji, który moim zdaniem wykonałby zadanie, gdyby było to wywołanie AJAX, ale niekoniecznie tak jest. Czy jest jakiś inny sposób, aby to osiągnąć?

+3

Nie wiem, co zrobiłeś, ale wydaje się, że powinieneś się go pozbyć. Odroczone są za zachowania nieblokujące, asynchroniczne. – bfavaretto

Odpowiedz

4

mam very helpful answer z listy mailingowej dojo-procentowej, więc pomyślałem, że go trzymać tutaj:

Niestety, nie można tego zrobić w przeglądarce.

JavaScript w przeglądarce jest jednowątkowy. Jeśli siedzisz czekając na odpowiedź odroczona, to używasz tego wątku. To jest ten sam wątek , który będzie potrzebny gdzieś w linii, aby obsłużyć wywołanie Deferred.resolve() (które samo w sobie spowoduje wywołanie funkcji , którą przekazałeś do .then()).

Możesz zadzwonić do XRS synchronicznie, ponieważ podstawowa implementacja XHR get pozwala na synchronizację połączenia. Funkcjonalność dojo/Odroczona jest tylko opakowaniem wokół elementów wewnętrznych XHR.