all - Perché javascript ES6 Promises continua l'esecuzione dopo una risoluzione?



promise function javascript example (2)

I callback che verranno richiamati quando si resolve una promessa sono ancora richiesti dalla specifica per essere chiamati in modo asincrono. Questo per garantire un comportamento coerente quando si usano le promesse per un mix di azioni sincrone e asincrone.

Pertanto, quando si richiama la resolve il callback viene messo in coda e l'esecuzione della funzione continua immediatamente con qualsiasi codice che segue la chiamata di resolve() .

Solo una volta che il loop degli eventi JS è stato restituito il controllo, il callback può essere rimosso dalla coda e effettivamente richiamato.

https://ffff65535.com

A quanto ho capito, una promessa è qualcosa che può risolvere () o rifiutare (), ma sono stato sorpreso di scoprire che il codice nella promessa continua ad essere eseguito dopo che è stata chiamata una risoluzione o un rifiuto.

Ho considerato risolvere o rifiutare di essere una versione asincrona di exit o return, che avrebbe fermato ogni esecuzione immediata della funzione.

Qualcuno può spiegare il pensiero dietro il perché il seguente esempio a volte mostra console.log dopo una chiamata di risoluzione:

var call = function() {
    return new Promise(function(resolve, reject) {
        resolve();
        console.log("Doing more stuff, should not be visible after a resolve!");
    });
};

call().then(function() {
    console.log("resolved");
});

jsbin


JavaScript ha il concetto di "corri fino al completamento" . A meno che non venga generato un errore, una funzione viene eseguita fino a quando non viene raggiunta un'istruzione return o la sua fine. Altro codice al di fuori della funzione non può interferire con quello (a meno che, di nuovo, non venga generato un errore).

Se si desidera resolve() per uscire dalla funzione di inizializzazione, è necessario anteporre al return :

return new Promise(function(resolve, reject) {
    return resolve();
    console.log("Not doing more stuff after a return statement");
});




es6-promise