TL; DR
Il codice che viene eseguito dopo una chiamata sincrona a una funzione diventa la continuazione del passaggio a una promessa quando si chiama la stessa funzione in modo asincrono.
Illustrazione dettagliata
Per darti un po 'di intuizione, ecco come un pezzo di codice sincrono viene trasformato in un pezzo di codice asincrono. L'intera risposta è scritta in modo informale, senza alcun particolare linguaggio di programmazione in mente.
Codice sincrono:
actionsBeforeCall();
x = computeSomething();
actionsAfterCall(x);
Questo illustra schematicamente che c'è un codice prima della chiamata, quindi la chiamata che può restituire un valore x, e quindi qualche altro codice che può dipendere dal risultato della chiamata attraverso la variabile x. Naturalmente ci possono essere più di una variabile ( x
, y
, ecc.) O nessuna variabile, ma le azioni successive alla chiamata dipendono da uno stato globale che è stato lasciato indietro da computeSomething ().
Se vuoi eseguire la chiamata in modo asincrono, puoi creare una promessa:
actionsBeforeCall();
p = promise(computeSomething);
Una promessa è un oggetto che rappresenta un calcolo che completerà un po 'di tempo in futuro, quindi il thread che ha avviato il calcolo asincrono può ancora avere un handle per comunicare con esso. Ora il thread principale non smetterà di aspettare che la funzione asincrona si interrompa, perché è in esecuzione in modo asincrono. Quindi abbiamo due problemi:
- In che modo il thread principale dice al calcolo asincrono cosa fare quando viene completato?
- In che modo il calcolo asincrono restituisce il risultato: ora è disaccoppiato dal thread che lo ha chiamato e non può restituire alcun valore.
Una continuazione risolve entrambi i problemi:
- È una funzione che deve essere invocata al termine del calcolo asincrono.
- La continuazione prende un argomento
x
che rappresenta il risultato restituito da computeSomething
. In alternativa, accede ad alcune variabili globali per recuperare il risultato prodotto da computeSomething
.
Quindi nel thread principale scrivi
actionsBeforeCall();
p = promise(computeSomething);
p.onComplete(actionsAfterCall)
L'ultima riga significa: quando computeSomething
è terminato, chiama la funzione actionsAfterCall
con il risultato. A sua volta, actionsAfterCall
deve prendere un argomento di input, in modo che la promessa possa internamente fare qualcosa del tipo:
x = computeSomething()
...
actionsAfterCall(x)
Un punto importante è che nei calcoli asincroni non si restituiscono i valori dei risultati. Invece, si passa il risultato di un calcolo a una continuazione.