Qual è la relazione tra promesse e continuazioni

3

Penso di capire di cosa si tratta Promises e penso di capire di cosa si tratta, ma non riesco ancora a vedere quale sia la loro connessione. In che modo le Promesse usano le Continuazioni. Non ritornano mai, il che è spiegato dal fatto che usano Continuazioni, ma non vedo quando e perché fanno il "salto" che è così caratteristico quando si lavora con le Continuazioni.

    
posta hgiesel 28.01.2017 - 00:50
fonte

1 risposta

4

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:

  1. In che modo il thread principale dice al calcolo asincrono cosa fare quando viene completato?
  2. 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:

  1. È una funzione che deve essere invocata al termine del calcolo asincrono.
  2. 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.

    
risposta data 28.01.2017 - 11:05
fonte

Leggi altre domande sui tag