2013-05-24 22 views
17

Ho una funzione in una catena di promesse che possono o non possono fare qualcosa. Per esempio.Creare una promessa vuota

getYear().then(function(results){ 
    if(results.is1999) return party(); 
    else return Q.fcall(function(){/*do nothing here*/}); 
    }).then(sleep) 

Dove getYear, party, e sleep tutte le promesse di ritorno. C'è un modo più conciso per scrivere la dichiarazione else? Cioè, non fare nulla, ma ancora restituire una promessa concatenabile?

+0

'return party' o' return party() '? –

+0

Grazie @ Beetroot-Barbabietola. Fisso. – prauchfuss

+0

Ho pensato che quella festa fosse solo un valore promettente piuttosto che una funzione che ha restituito una promessa. Avevo anche pensato che non importava in alcun modo perché questo era solo codice per dimostrare l'esempio. Ora sono costretto a pensare che tu stia davvero creando un programma che organizza una festa, ma solo se è il 1999. – ForbesLindesay

risposta

26

Sì. Q(value) restituisce una promessa per lo value (inoltre scartina il valore se value è una promessa).

getYear().then(function(results){ 
    if(results.is1999) return party(); 
    else return Q(undefined); 
    }).then(sleep) 

In alternativa, è possibile ottenere l'esatto stessa semantica di solo non tornare nulla:

getYear().then(function(results){ 
    if(results.is1999) return party(); 
    }).then(sleep) 

Se ciò che si voleva era una promessa che non è mai stato risolto, la soluzione migliore sarebbe

getYear().then(function(results){ 
    if(results.is1999) return party(); 
    else return Q.promise(function() {}); 
    }).then(sleep) 

Che cosa si potrebbe fare è riutilizzare la stessa promessa:

var stop = Q.promise(function() {}); 
    getYear().then(function(results){ 
    if(results.is1999) return party(); 
    else return stop 
    }).then(sleep) 
+0

Cosa intendi con "una promessa che non è mai stata risolta"? C'è qualche vantaggio rispetto a quello di avere una promessa che restituisce il valore (ad esempio, 'risultati')? –

+0

@Patrick Promises può essere in uno dei tre stati: In attesa, Completato e Rifiutato. Puoi mantenere una promessa permanente nello stato "In attesa" per sempre. Questo è ciò che intendo per "una promessa che non è mai stata risolta". Direi che in generale si tratta di un anti-pattern, ma potrebbe essere utile se si vuole evitare che tutta la logica dopo che una data funzione abbia mai avuto luogo. Ti consente, in effetti, di saltare tutti gli addetti al successo e tutti i gestori degli errori più avanti nella catena. Probabilmente è meglio evitare comunque. – ForbesLindesay

+0

Sì, sembra una cattiva idea. Cosa c'è nell'esempio che fa sì che la promessa non venga mai soddisfatta? Perché il finale '.then (sleep)' restituisce una promessa che non viene mai assegnata a qualcosa? (E quindi non può essere '.then'ed o' .done''ed?) –

Problemi correlati