Mam problem ze zrozumieniem javaScript promises
. Napisałem następujący kod:
var p = new Promise(function(resolve,reject){
reject(Error("hello world"));
});
setTimeout(()=>p.catch(e=>console.log(e)),5000);
Od razu widzę to w mojej konsoli programisty Chrome:
Ale po odczekaniu 5 sekund wiadomość automatycznie zmienia kolor na czarny, jak na tym obrazku:
Nigdy wcześniej nie widziałem takiego zachowania między moim kodem javaScript a konsolą programisty, gdzie mój kod javaScript może „modyfikować istniejącą zawartość” w konsoli programisty.
Postanowiłem więc sprawdzić, czy występuje taka sama sytuacja resolve
, pisząc ten kod:
var p = new Promise(function(resolve,reject){
resolve("hello world");
});
setTimeout(()=>p.then(e=>console.log(e)),5000);
Ale w tej sytuacji moja konsola programisty nie pokazuje niczego, aż 5 sekund później, a następnie drukuje hello world
.
Dlaczego są tak traktowane resolve
i reject
traktowane w różny sposób, gdy są wywoływane?
DODATKOWY
Napisałem również ten kod:
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);
Powoduje to kilka wyników w konsoli programisty. Czerwony błąd w czasie 0, czerwony zmienia się na czarny w czasie 5 sekund z tekstem errors hello world
, następnie nowy komunikat o błędzie w czasie 6 sekund errors 2 hello world
, a następnie czerwony komunikat o błędzie w czasie 7 sekund. Teraz jestem bardzo zdezorientowany, ile razy reject
faktycznie wywoływane ... Jestem zagubiony ...
var p = new Promise(function(resolve,reject){ reject(Error("hello world")); });
można bardziej idiomatycznie i zwięźle napisać jakovar p = Promise.reject(Error("hello world"));
:-)