JavaScript introduzione


Esempio

Un oggetto Promise rappresenta un'operazione che ha prodotto o che alla fine produrrà un valore. Le promesse forniscono un modo efficace per avvolgere il risultato (possibilmente in sospeso) del lavoro asincrono, attenuando il problema dei callback profondamente nidificati (noto come " inferno di callback ").

Stati e controllo del flusso

Una promessa può essere in uno dei tre stati:

  • in sospeso - L'operazione sottostante non è stata ancora completata e la promessa è in attesa di adempimento.
  • soddisfatto - L'operazione è finita e la promessa è soddisfatta con un valore . Questo è analogo alla restituzione di un valore da una funzione sincrona.
  • respinto - Si è verificato un errore durante l'operazione e la promessa viene respinta per un motivo . Questo è analogo al lancio di un errore in una funzione sincrona.

Si dice che una promessa sia risolta (o risolta ) quando è soddisfatta o respinta. Una volta stabilita una promessa, diventa immutabile e il suo stato non può cambiare. I metodi then e catch di una promessa possono essere utilizzati per allegare i callback che vengono eseguiti quando viene risolto. Questi callback vengono richiamati rispettivamente con il valore di evasione e il motivo di rifiuto.

Prometti il ​​diagramma di flusso

Esempio

const promise = new Promise((resolve, reject) => {
    // Perform some work (possibly asynchronous)
    // ...

    if (/* Work has successfully finished and produced "value" */) {
        resolve(value);
    } else {
        // Something went wrong because of "reason"
        // The reason is traditionally an Error object, although
        // this is not required or enforced.
        let reason = new Error(message);
        reject(reason);

        // Throwing an error also rejects the promise.
        throw reason;
    }
});

I metodi then e catch possono essere utilizzati per allegare callback di adempimento e rifiuto:

promise.then(value => {
    // Work has completed successfully,
    // promise has been fulfilled with "value"
}).catch(reason => {
    // Something went wrong,
    // promise has been rejected with "reason"
});

Nota: la chiamata di promise.then(...) e promise.catch(...) sulla stessa promessa potrebbe comportare Uncaught exception in Promise se si verifica un errore, durante l'esecuzione della promessa o all'interno di uno dei callback, quindi il modo preferito sarebbe quello di collegare il prossimo ascoltatore alla promessa restituita dal precedente then / catch .

In alternativa, entrambe le callback possono essere allegate in una singola chiamata per then :

promise.then(onFulfilled, onRejected);

Allegando i callback a una promessa che è già stata risolta, li inseriremo immediatamente nella coda del microtask e verranno richiamati "il prima possibile" (cioè immediatamente dopo lo script attualmente in esecuzione). Non è necessario verificare lo stato della promessa prima di allegare i callback, diversamente da molte altre implementazioni che generano eventi.


Dimostrazione dal vivo