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.
quindi qual è la differenza tra il thenable e la promessa? come definiresti la differenza? –
Se creo un oggetto 'var foo = {'then': function() {alert (123)}};', allora è una variabile, ma ovviamente non è una promessa. – Kos
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. –