2013-06-27 11 views
5

Ho una domanda su dojo/differita. Inizierò con la domanda, poi andrò più in dettaglio su quello che sto facendo:Come eseguire codice comune dopo che un oggetto Dojo Deferred è stato risolto o rifiutato?

Esiste un modo per eseguire le stesse linee di codice indipendentemente dal risultato del differito, un po 'come un blocco finally in una dichiarazione try...catch? Da quello che ho letto, non sembra che ci sia, ma forse sto capendo la documentazione sbagliata e volevo verificarlo con la comunità SO.

Ecco quello che sto facendo:

Nel Dojo 1.9 (funziona anche in 1.8), ho un'istanza di un dojox.widget.Standby (un carico di sovrapposizione) per un ContentPane prima di caricare alcuni dati. Una volta completata la chiamata posticipata, voglio nascondere la mia sovrapposizione come mostrato di seguito:

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(); 
}); 

Questo funziona correttamente; tuttavia, presumibilmente, potrei avere qualche processo da implementare dopo il completamento differito che occupa diverse righe di codice anziché solo una singola riga e non vorrei duplicare quelle linee di codice. Un'alternativa potrebbe essere quella di creare una funzione privata e chiamarla semplicemente con una sola riga in ogni blocco, ma se c'è un modo migliore, preferirei seguire questa strada.

Grazie in anticipo!

risposta

5

È possibile utilizzare il metodo always dell'API Promises per eseguire una funzione indipendentemente dal fatto che il sottostante Deferred abbia esito positivo o negativo.

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

Questa è una buona domanda. Un oggetto dojo/Deferred restituirà un altro oggetto rinviato quando viene chiamato Deferred#then. Ciò consente di concatenare una differenza con più callback che vengono attivati ​​in un ordine seriale. Pertanto, io credo che si possa fare qualcosa di simile:

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(); 
}); 

È possibile see this example fiddle che illustra una simile, seppur semplice, caso d'uso in cui indipendentemente se la differite è respinta o risolto, la richiamata al secondo Deferred#then è sparato dopo l'errore iniziale/callback di successo.

+0

voi e @Lucas hanno risposto alla mia domanda dal momento che entrambe le risposte sono corrette. Ho dato la 'migliore risposta' a @ Lucas perché ritengo che 'sempre 'rappresenti un intento più chiaro di un addizionale' then'. Ma ho votato la tua risposta per la sua correttezza. – David

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

Questo non sembra aggiungere nulla rispetto alle risposte esistenti. – Bergi

+0

sì, la funzione estesa promette, quindi utilizzo la proprietà promessa senza dover chiamare la funzione .then() e impostare le funzioni di callback. – max4ever

+0

Le altre risposte usano '.then()' perché l'OP ha bisogno anche di quelle funzioni di callback dipendenti dal risultato. – Bergi