Ho problemi a capire javaScript promises
. Ho scritto il seguente codice:
var p = new Promise(function(resolve,reject){
reject(Error("hello world"));
});
setTimeout(()=>p.catch(e=>console.log(e)),5000);
Lo vedo immediatamente nella mia console di sviluppo di Chrome:
Ma dopo aver atteso 5 secondi, il messaggio diventa automaticamente nero come questa immagine:
Non ho mai visto questo comportamento prima tra il mio codice javaScript e una console per sviluppatori, in cui il mio codice javaScript può "modificare il contenuto esistente" nella console per sviluppatori.
Quindi ho deciso di vedere se si verifica la stessa situazione resolve
scrivendo questo codice:
var p = new Promise(function(resolve,reject){
resolve("hello world");
});
setTimeout(()=>p.then(e=>console.log(e)),5000);
Ma in questa situazione, la mia console per sviluppatori non mostra nulla fino a 5 secondi dopo, a cui stampa hello world
.
Perché sono resolve
e reject
trattati in modo così diverso in termini di quando vengono invocati?
EXTRA
Ho anche scritto questo codice:
var p = new Promise(function(resolve,reject){
reject(Error("hello world"));
});
setTimeout(()=>p.catch(e=>console.log("errors",e)),5000);
setTimeout(()=>p.catch(e=>console.log("errors 2",e)),6000);
setTimeout(()=>p.catch(null),7000);
Ciò causa diversi output alla console per gli sviluppatori. Errore rosso all'ora 0, rosso diventa nero all'ora 5 secondi con il testo errors hello world
, quindi un nuovo messaggio di errore all'ora 6 secondi errors 2 hello world
, quindi un messaggio di errore rosso all'ora 7 secondi. Ora sono molto confuso su quante volte reject
viene effettivamente invocato ... Mi sono perso ...
var p = new Promise(function(resolve,reject){ reject(Error("hello world")); });
può essere più idiomaticamente e concisamente scritto comevar p = Promise.reject(Error("hello world"));
:-)