2013-02-12 25 views
21

Sto scrivendo del codice JS che usa le promesse. Ad esempio, apro un modulo pop-up e restituisco un oggetto jQuery Deferred. Funziona in questo modo:Quando dovrei rifiutare una promessa?

  • Se l'utente fa clic su OK sul modulo, e convalida, le risolve differite per un oggetto che rappresenta i dati del modulo.

  • Se l'utente fa clic su Annulla, il rinviato si risolve in un valore nullo.

Quello che sto cercando di decidere si dovrebbe la differita invece respingere, invece di risolvere? Più in generale, mi chiedo quando dovrei risolvere qualcosa di simile a un oggetto nullo e quando dovrei rifiutare?

Ecco alcuni codice che illustrano le due posizioni:

// Resolve with null. 
var promise = form.open() 
    .done(function (result) { 
     if (result) { 
      // Do something with result. 
     } else { 
      // Log lack of result. 
     } 
    }); 

// Reject. 
var promise = form.open() 
    .done(function (result) {    
     // Do something with result.    
    }) 
    .fail(function() { 
     // Log lack of result. 
    }); 
+0

Sembra una decisione di progettazione perfettamente valida in entrambi i casi. –

+0

Non penso che un metodo sia migliore dell'altro, ma di solito associo "fail" a qualcosa che non va, come un'eccezione piuttosto che un valore scelto, cioè l'incapacità di essere in grado di mantenere la promessa anziché completare la promessa con un certo valore. –

+0

@ExplosionPills Sì, è quello che sto cercando di ottenere. Quindi dovrei trattare un rifiuto di promessa come la stessa gravità di un'eccezione? – cdmckay

risposta

4

La semantica delle tue due strategie non è proprio la stessa. Il rifiuto esplicito di un rinvio è significativo.

Ad esempio, $.when() manterrà i risultati accumulati fino a quando gli oggetti posticipati che è passato hanno esito positivo, ma verrà eseguito il salvataggio in caso di fallimento del primo.

Ciò significa che, se si rinominare i due promesse promise1 e promise2 rispettivamente:

$.when(promise1, promise2).then(function() { 
    // Success... 
}, function() { 
    // Failure... 
}); 

Il codice qui sopra aspettare fino a quando la seconda forma è chiusa, anche se la prima forma viene annullato, prima di invocare uno dei i callback passati a then(). Il callback richiamato (successo o fallimento) dipenderà solo dal risultato del secondo modulo.

Tuttavia, il codice non attenderà per il primo modulo da chiudere prima di richiamare il callback di errore se il secondo modulo viene annullato.

2

Dal momento che è controllata dall'utente, non mi trattano come un "fallimento". La prima opzione sembra più pulita.

0

Beh, in entrambi i casi si farebbe qualcosa di diverso, quindi direi sempre o risolverlo o rifiutarlo. Fai il tuo post sulla risoluzione e sul rifiuto non fare nulla. Quindi, sempre, chiudi il modulo.

var promise = form.open() 
.done(function (result) {    
    // Do something with result.    
}) 
.fail(function() { 
    // Log lack of result. 
}) 
.always(function() { 
    // close the form. 
}) 

Se non si sta rifiutando il cancellare, se stai sempre rifiutando a tutti? a quel punto, perché usare un oggetto differito? Potresti rifiutare l'errore di input, ma in tal caso dovresti generare una nuova promessa se vuoi consentire loro di risolverlo.


I differimenti non sembrano la cosa giusta da usare qui. Userei solo eventi.

+0

Hai sempre bisogno di un caso di rifiuto per usare una promessa? – cdmckay

+0

Immagino di no, a seconda della situazione. –

+0

Le promesse sono sempre migliori degli eventi quando si tratta di un'unica operazione asincrona. Puoi usare i combinatori su promesse che non puoi fare con gli eventi. – ForbesLindesay

Problemi correlati