2015-04-03 19 views
15

Sto controllando la "Promesse/A +" specifica, ma non riuscivo a capire le seguenti cose:Riguardo a Promises/A + Specification, qual è la differenza tra i termini "thenable" e "promise"?

nella sezione 1. Terminologia,

1.1. "promise” è un oggetto o una funzione con un metodo then il cui comportamento è conforme a questa specifica.

1.2. “thenable” è un oggetto o una funzione che definisce un metodo allora.

Quindi qual è la differenza tra i termini "thenable" e "promise"?

Anche nella sezione 2.3. The Promise Resolution Procedure,

La procedura di risoluzione promessa è un'operazione astratta che prende come input una promessa e un valore, che denotiamo come [[Resolve]](promise, x).

Quindi la mia domanda è:

Perché denotava entro 2 parentesi di apertura e chiusura? C'è qualche convenzione?

Grazie mille.

risposta

4

Questo è un tentativo intelligente per rendere più semplice l'interoperabilità delle promesse tra diverse librerie.

La specifica utilizza il termine thenable in pochi punti. Questo è il più importante (empasis mio): procedura di risoluzione delle

La promessa è un'operazione astratta prendendo come input una promessa e un valore, che indicheremo come [[Resolve]](promise, x). Se x è uno modificabile, tenta di far sì che la promessa adotti lo stato di x, assumendo che x si comporti almeno in qualche modo come una promessa. Altrimenti, soddisfa la promessa con il valore x.

Questo renderà implementatori fare un controllo del tipo:

if (typeof(x.then) === 'function') { 
    // adopt the state of x 
} else { 
    // fulfill promise with value x 
} 

Se le specifiche invece detto "se x è una promessa, poi ...", come sarebbe l'implementor sapere se è x una promessa o no? Non c'è un modo pratico per assicurarsi che lo x sia conforme alle specifiche Promise semplicemente controllandolo.

un implementor (diciamo, biblioteca FooPromises potrebbe fare qualcosa di simile

if (x instanceof FooPromises.Promise) { 
    // adopt the state of x 
} else { 
    // fulfill promise with value x 
} 

e sarebbe efficace respingere promesse provenienti da diverse implementazioni.

Invece, utilizzando una definizione super-semplice di thenable in questa condizione che gli implementatori possono facilmente verificare, è banale fare questo controllo e rendere possibile alle implementazioni di essere piacevoli l'uno con l'altro.


Per voi seconda domanda, non sono sicuro, ma la mia idea sarebbe che una notazione [[Resolve]](promise, x) sottolinea che si tratta di un'operazione astratta. Se lasciavano cadere le parentesi e dicevano semplicemente Resolve(promise, x), ciò implicherebbe in qualche modo che gli implementatori dovessero svolgere una funzione reale denominata Resolve ed esporla.

Questo non è necessario - Resolve non fa parte dell'interfaccia delle promesse; è solo una parte del loro comportamento che è stato abbastanza importante da dare un nome e una sezione separata nei documenti.

+0

quindi qual è la differenza tra il thenable e la promessa? come definiresti la differenza? –

+0

Se creo un oggetto 'var foo = {'then': function() {alert (123)}};', allora è una variabile, ma ovviamente non è una promessa. – Kos

+0

Grazie per il vostro chiarimento. quindi una persona che ha un valore è ciò che ha una funzione "allora" e una promessa è un tipo speciale di valore che conforma le specifiche per quanto ho capito. –

14

Quindi qual è la differenza tra i termini "thenable" e "promise"?

penso che la sezione è già stato citato non risponde molto bene:

  • Un thenable è un oggetto con un metodo then. Qualsiasi oggetto
  • Una promessa è un oggetto con un metodo then (vale a dire una variabile) conforme alla specifica.

Finora così semplice. Penso che la tua vera domanda sia: "Perché si sono distinti?"

Il problema è che guardando un oggetto non si può decidere se è una promessa.
È potere dire che è una promessa perché puoi vedere che il suo metodo then è implementato da te o da qualcuno di cui ti fidi - la libreria di tua scelta di solito. Sareste in grado di "vederlo" perché l'oggetto eredita dal prototipo di una promessa, o potete anche confrontare il metodo essendo (referenzialmente) identico alla funzione che avete definito. O qualsiasi altro metodo di ispezione che è sufficiente per te.
È in grado di dire che non è una promessa perché non ha il metodo then.
Ma cosa fai con un oggetto che implementa then, ma non è noto per essere una promessa? È una percorribile e verrà gestita come tale.

La specifica Promises/A + mira all'interoperabilità tra le implementazioni di promessa e utilizza l'esistenza di un metodo .then() per duck typing. Specifica un algoritmo esatto su come trattare tali argomenti (che potrebbe essere essere promesse o almeno avere un comportamento simile) in modo da poter creare una promessa reale, attendibile ("conosciuta") da loro.

Perché è indicato all'interno di 2 staffe di apertura e chiusura? C'è qualche convenzione?

Sì, le specifiche ECMAScript usare questa sintassi per internal methods and properties:

I nomi di proprietà interne sono racchiusi tra doppie parentesi quadre [[]].

Queste proprietà in realtà non hanno bisogno di esistere, che stanno puramente usato per descrivere ciò che dovrebbe accadere - un'implementazione deve agire come se che li ha usati. Sono comunque operazioni totalmente astratte.

+1

Risposta molto bella. Potrebbe essere bello mostrare esempi delle specifiche di quanto sia insostenibile una cosa plausibile - le protezioni specifiche contro i getters, i thenables che lanciano, i thenables che assimilano i thenables che si lanciano e così via. –

+0

Non ho trovato dalle specifiche Promise A + quali sono i requisiti del metodo 'then' di thenable. Se è obbligatorio restituire le promesse, ecc. Le specifiche sono un po 'oscure a riguardo. –

+0

@ MikaelLepistö Le specifiche Promises/A + non presuppongono * nulla * sui temi (i loro metodi 'then' sono richiamati con due callback e si prevede che richiamino almeno uno di essi almeno una volta). quindi il metodo delle promesse. – Bergi

Problemi correlati