ฉันมีปัญหาในการทำความเข้าใจ promises
javaScript ฉันเขียนรหัสต่อไปนี้:
var p = new Promise(function(resolve,reject){
reject(Error("hello world"));
});
setTimeout(()=>p.catch(e=>console.log(e)),5000);
ฉันเห็นสิ่งนี้ในคอนโซลนักพัฒนาซอฟต์แวร์ Chrome ทันที:
แต่หลังจากฉันรอ 5 วินาทีข้อความจะเปลี่ยนเป็นสีดำเหมือนภาพนี้โดยอัตโนมัติ:
ฉันไม่เคยเห็นพฤติกรรมนี้มาก่อนระหว่างรหัส javaScript ของฉันและคอนโซลนักพัฒนาซอฟต์แวร์ซึ่งรหัส javaScript ของฉันสามารถ "แก้ไขเนื้อหาที่มีอยู่" ในคอนโซลนักพัฒนาซอฟต์แวร์
ดังนั้นฉันตัดสินใจที่จะดูว่าสถานการณ์เดียวกันเกิดขึ้นกับresolve
การเขียนรหัสนี้:
var p = new Promise(function(resolve,reject){
resolve("hello world");
});
setTimeout(()=>p.then(e=>console.log(e)),5000);
แต่ในสถานการณ์นี้คอนโซลนักพัฒนาซอฟต์แวร์ของฉันจะไม่แสดงผลใด ๆ จนกว่าจะถึง 5 วินาทีหลังจากนั้นซึ่งจะพิมพ์hello world
ออกมา
ทำไมresolve
และreject
ได้รับการปฏิบัติที่แตกต่างกันในแง่ของเมื่อพวกเขาถูกเรียก?
EXTRA
ฉันยังเขียนรหัสนี้:
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);
ซึ่งทำให้หลายเอาต์พุตไปยังคอนโซลผู้พัฒนา ข้อผิดพลาดสีแดง ณ เวลา 0 สีแดงเปลี่ยนเป็นสีดำในเวลา 5 วินาทีด้วยข้อความerrors hello world
จากนั้นข้อความแสดงข้อผิดพลาดใหม่ในเวลา 6 วินาทีerrors 2 hello world
จากนั้นข้อความแสดงข้อผิดพลาดสีแดงในเวลา 7 วินาที ตอนนี้ฉันสับสนมากถึงจำนวนครั้งที่reject
ถูกเรียกจริง .... ฉันหลงทาง ...
var p = new Promise(function(resolve,reject){ reject(Error("hello world")); });
สามารถเขียนโดยใช้สำนวนและรัดกุมมากขึ้นเป็นvar p = Promise.reject(Error("hello world"));
:-)