2013-08-13 10 views
25

Sto studiando il modello di promesse e con q di kriskowal per node.js,Cosa succede se rifiuto/risolvo più volte in q di Kriskowal?

avere questo frammento:

var deferred = Q.defer(); 
try { 
    messageData = JSON.parse(message); 
} catch (e) { 
    global.logger.warn('Error parsing JSON message.'); 
    deferred.reject(e); 
} 
... 
if (some_reason) 
    deferred.resolve(something); 
... 
return deferred.promise; 

se sia il parser non riesce e some_reason è vero?

L'esecuzione procede dal rifiuto attraverso la risoluzione e il metodo di entrambe le promesse può essere chiamato in momenti diversi, generando così un errore?

Devo evitare di chiamare rifiutare/risolvere più volte?

risposta

38

A partire dal promises can only resolve once (risp. o rifiutato), la prima risoluzione vince e tutte le altre chiamate verranno ignorate. Da the docs:

In tutti i casi in cui la promessa si risolve (vale a dire sia soddisfatta o rifiutato), la risoluzione è permanente e non può essere resettato. Il tentativo di chiamare risolvere, rifiutare o notificare se la promessa è già stata risolta sarà vietato.

Dovrei evitare di chiamare rifiutare/risolvere più volte?

È persino possibile progettare l'applicazione in modo che due metodi "si rincorrono" l'uno contro l'altro per risolvere un rinvio, ma in generale si dovrebbe evitare di ridurre la confusione di un lettore.

+0

Non so della gara, ho usato jQuery differite esattamente per quello. per esempio. andare alla schermata successiva quando l'utente fa clic o quando scade il tempo. "Qualunque cosa arriverà prima". Trovo strano che le librerie come Kew.js generino effettivamente un errore quando provano a risolvere due volte. :( –

+0

@ bfred.it: Sì, puoi * farlo * ma è meglio fare esplicitamente 'Q.race (getNextUserClick(), Q.timeout (...)). Then (nextScreen)' di [avere un singolo differito] (https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern) e risolvendolo manualmente più volte. – Bergi

+0

'Race' è interessante ma kew.js doesn ' In realtà lo sono, sfortunatamente. –

Problemi correlati