2015-03-25 14 views
15

Mi sto confondendo con la terminologia diversa generata. Dalla mia comprensione, una promessa può essere:Qual è la terminologia corretta per le promesse javascript

fulfilled 
rejected 
pending 
settled 
resolved 
defer 

La risoluzione significa risolta? o significa che è stato adempiuto? e cosa diavolo è rimandare?

+2

Sfortunatamente, questa terminologia non viene utilizzata in modo coerente. In particolare, troppe persone usano "risolto" per significare "soddisfatto".È possibile trovare questo utile: http://stackoverflow.com/questions/18280375/q-js-difference-between-resolve-and-fulfill/18295163#18295163 –

risposta

35

terminologia può essere difficile.
Prendiamo dal Promises/A+ specification e la respective ES6 section che ci sono stati 3 :

  • attesa - la promessa non hanno preso un valore ancora, è il futuro è ancora incerto.
  • soddisfatte - la promessa ha ottenuto con successo un valore risultato "assegnato"
  • respinto - la promessa è dato un motivo per perché nessun risultato potrebbe essere acquisita, in genere un errore.

Il termine stabilirono è un hyperonym per soddisfatte e respinto, che significa sia - il contrario di attesa.

I verbi dinamici soddisfano e rifiutano descrivere il cambiamento della condizione di attesa in entrambi la adempiuta o rifiutata. Queste transizioni sono chiamate evasione o rifiuto della promessa.

Questi erano facili. Ora, risoluzione è una bestia diversa. A volte è usato anche come "adempiere", ma sarebbe meglio intendere come sistemare il destino della promessa sia soddisfatta sia respinta. La risoluzione (di rado: regolamento) di una promessa significa che lascia lo stato in sospeso. Ma nemmeno questo è precisa - il problema è la natura ricorsiva del Promessa Risoluzione Procedura:

  • risolvere una promessa con un valore "normale" si intende realizzarlo
  • risolvere una promessa con una promessa (o thenable) significa adottare il suo stato:

    • risolvere con la promessa soddisfatto è un adempimento
    • risolvere con la promessa respinto è un rifiuto
    • risolvere con una promessa in attesa significa aspettando la sua risoluzione

Sì, se una promessa si risolve essa potrebbe anche non essere noto se sta andando essere soddisfatti o rifiutato. Ma significa che il destino è non più indeterminato, in quanto è legato alla promessa che abbiamo risolto con (notare che è possibile risolvere una promessa una sola volta).

Ignorare questo caso speciale, una promessa di solito significa una promessa risolta.

O, per citare i ECMAScript 6 Specification:

Una promessa è risolto se è risolta o se è stato “bloccato in” per abbinare lo stato di un'altra promessa. Il tentativo di risolvere o rifiutare una promessa risolta non ha alcun effetto. Una promessa è irrisolta se non è stata risolta. Una promessa irrisolta è sempre in sospeso. Una promessa risolta potrebbe essere in sospeso, soddisfatta o respinta.


e cosa diavolo è rinviare?

Differire risultato significa che ritorni un (asincrona) promessa per il risultato, e non il risultato direttamente (sincrono). E restituire anche un rifiuto differito instead of throwing synchronously.

Si noti che "rinviare" è utilizzato anche in alcune librerie (Q) come il nome del metodo per costruire un oggetto Deferred - vedi this answer on The differences between Deferred, Promise and Future per una buona spiegazione.
Oh, e non fidatevi mai dei nomi delle variabili: defer potrebbe anche essere un "deferredObject" abbreviato.

+2

typo: hyperonym → hypernym – kYuZz

+0

@kYuZz: sembra [entrambi sono validi] (https://en.wikipedia.org/wiki/Hyperonym). – Bergi

+1

A + per quella visuale –

8

I tre stati di promessa sono elencati in section 2.1 of the Promises/A+ specification.

Dalla specifica:

enter image description here

Così qui sono ciascuno dei termini che ha chiesto circa:

attesa è stato promessa iniziale. L'operazione rappresentata dalla promessa non è stata ancora riempita o respinta.

Soddisfacente è un altro dei tre stati di promessa. Significa che la promessa è stata risolta e ora ha il suo valore risolto. L'operazione rappresentata dalla promessa è stata completata con successo.

Respinto è un altro dei tre stati di promessa. Significa che la promessa è stata respinta e ora ha la sua ragione respinta. L'operazione rappresentata dalla promessa non è riuscita ad ottenere un valore e quindi ha un motivo per non riuscire a farlo (in genere un codice di errore o un oggetto di errore, ma può essere qualsiasi cosa).

Fondata è un termine che significa la promessa è adempiuta o o rifiutato (per esempio non è in attesa di più), ma non è uno stato separato solo un termine descrittivo per indicare che non è più in sospeso.

risolto è un termine che viene spesso utilizzato per indicare lo stesso fulfilled, ma i due non sono esattamente gli stessi. Una promessa può essere risolta con un valore che porta alla realizzazione o può essere risolta con una promessa respinta (che porta al rifiuto di questa promessa) o può essere risolta con una promessa in sospeso (il che significa che ora aspetterà sull'eventuale stato di qualche altra promessa).

È difficile dire esattamente cosa intendi per differire. Le promesse sono spesso classificate come oggetti deferred in quanto sono un oggetto che rappresenta un'azione e un risultato che è rinviato al futuro (si verificherà in futuro). In alcune implementazioni di promesse, ci sono in realtà due tipi di oggetti, un oggetto deferred e un oggetto promise. L'oggetto differito è un superset dell'oggetto promessa. Entrambi possono osservare quando l'azione viene risolta o respinta con i gestori .then(). Tuttavia, solo l'oggetto deferred può effettivamente cambiare lo stato in resolved o rejected.

In jQuery, è possibile creare un oggetto posticipato con $.Deferred(). In altre implementazioni come ES6 promette, hai solo oggetti promettenti con un callback costruttore che ha le funzioni reject e resolve. Il mondo presumibilmente si sta muovendo verso ciò che ES6 avrà.

jQuery esempio che utilizza un oggetto deferred:

function delay(t) { 
    var defer = $.Deferred(); 
    setTimeout(function() { 
     defer.resolve(); 
    }, t); 
    return defer.promise() 
} 

delay(200).then(function() { 
    // run my delayed function now 
    doMyThing(); 
}); 

ES6 promessa esempio:

function delay(t) { 
    return new Promise(function(resolve, reject) { 
     setTimeout(function() { 
      resolve(); 
     }, t); 
    }); 
} 

delay(200).then(function() { 
    // run my delayed function now 
    doMyThing(); 
}); 
+1

Perché il downvote? – jfriend00

+0

A loro non piace quando citate le specifiche./s –

+0

@MillieSmith - sì, per quanto mi piace e uso MDN come risorsa utile, sembra che questa volta abbia sbagliato questa volta, quindi ho pensato che fosse opportuno andare direttamente alle specifiche. – jfriend00

1

"States and Fates" di Domenic Denicola è un buon riassunto conciso.

Uniti:

  • una promessa è soddisfatte se promise.then(f) chiamerà f "al più presto possibile"
  • una promessa è respinto se promise.then(undefined, r) chiamerà r "al più presto possibile"
  • una promessa è in attesa se non è né soddisfatta né respinta.

Fates:

  • una promessa è risolto se cercasse di risolvere o rifiutare non ha alcun effetto, cioè la promessa è stata "bloccata in" a uno seguire un'altra promessa, o si è adempiuta oppure respinto
  • una promessa è non risolta se non viene risolto, vale a dire se provare a risolverlo o rifiutarlo avrà un impatto sulla promessa.

Seguire il collegamento per i dettagli 'relativi stati e destini'.

Problemi correlati