2013-06-27 6 views
5

Mam pytanie dotyczące dojo/Odroczone. Zacznę od pytania, a następnie przejdę do bardziej szczegółowych informacji na temat tego, co robię:Jak wykonać wspólny kod po odroczeniu obiektu Dojo, który został rozwiązany lub odrzucony?

Czy istnieje sposób na wykonanie tych samych linii kodu niezależnie od wyniku odroczenia, na przykład blok finally w oświadczenie try...catch? Z tego, co przeczytałem, nie wygląda na to, że jest, ale może rozumiem, że dokumentacja jest niewłaściwa i chciałem to zweryfikować w społeczności SO.

Oto co robię:

W Dojo 1.9 (działa także w 1.8), I instancji dojox.widget.Standby (ładowanie) nakładki na ContentPane przed załadowaniem jakieś dane. Po odroczony rozmowa zakończyła, chcę ukryć nakładkę, jak pokazano poniżej:

standby = new Standby({ 
    ... // standby props 
}); 
this.addChild(standby); 
standby.show(); 

queryResults = grid.store.query({ 
    ... // query props 
}); 
queryResults.then(function (results) { 
    if (results) { 
     ... // do something 
    } 

    standby.hide(); 
}, function (error) { 
    ... // handle error 

    standby.hide(); 
}); 

Działa to dobrze; jednak prawdopodobnie mógłbym wdrożyć jakiś proces po zakończeniu odroczonego zakończenia, które zajmuje kilka linii kodu, zamiast tylko jednej linii i nie chciałbym duplikować tych linii kodu. Alternatywą byłoby stworzenie funkcji prywatnej i po prostu wywołanie jej za pomocą jednego liniowca w każdym bloku, ale jeśli jest lepszy sposób, wolałbym tę trasę.

Z góry dziękuję!

Odpowiedz

5

Możesz użyć metody Promises API, aby wykonać funkcję niezależnie od tego, czy bazowa Deferred się powiedzie, czy nie.

queryResult 
    .then(onSuccess, onFailure) 
    .always(function() { 
     standby.hide(); 
    }); 
2

To jest dobre pytanie. Obiekt dojo/Deferred zwróci inny obiekt Odroczony po wywołaniu Deferred#then. Pozwala to na połączenie różnych połączeń zwrotnych uruchamianych w kolejności szeregowej. Dlatego uważam, że można zrobić coś takiego:

queryResults.then(function (results) { 
    if (results) { 
     ... // do something 
    } 
}, function (error) { 
    ... // handle error 
}).then(function(data){ 
    // This will be fired with data returned from the previous callback. 
    standby.hide(); 
}); 

Można see this example fiddle który ilustruje podobny, choć prosty, przypadek użycia tam, gdzie niezależnie od tego, czy odroczony jest odrzucane lub rozwiązany, oddzwanianie do drugiego Deferred#then jest zwolniony po początkowym wywołaniu błędu/sukcesu.

+0

zarówno ty i @Lucas odpowiedziałeś na moje pytanie, ponieważ oba swoje odpowiedzi są prawidłowe. Dałem "Najlepszą odpowiedź" dla @Lucas, ponieważ myślę, że "zawsze" oznacza wyraźniejszą intencję niż dodatkowe "wtedy". Ale głosowałem za twoją odpowiedzią za jej poprawność. – David

-1
var deferred = new Deferred(); 
deferred.promise.always(function() { alert('ciao'); }); 
+0

To wydaje się nie dodawać niczego ponad istniejące odpowiedzi. – Bergi

+0

tak, powoduje, że wyłączenie rozszerza obietnicę, więc używam właściwości obietnicy bez konieczności wywoływania funkcji .then() i ustawiania funkcji zwrotnych. – max4ever

+0

Pozostałe odpowiedzi używają '.then()', ponieważ OP potrzebuje również tych funkcji zwrotnych zależnych od wyniku. – Bergi

Powiązane problemy