ฉันพบพฤติกรรมที่ไม่สอดคล้องกันใน Google Chrome 60.0.3112.78 (รุ่นอย่างเป็นทางการ) (64 บิต) เมื่อใช้ ES6+ async/await สมัยใหม่ ขึ้นอยู่กับว่าฉันใช้วงเล็บในฟังก์ชันลูกศรที่ส่งคืน สัญญา. สิ่งเดียวกันนี้เกิดขึ้นใน Node.js ฉันมีปัญหาในการทำความเข้าใจว่าทำไม
ฉันเข้าใจว่านี่ไม่ใช่วิธีการใช้ฟังก์ชัน sleep() แต่เป็นวิธีที่ง่ายที่สุดในการสาธิต พิจารณาตัวอย่างโค้ดต่อไปนี้
function sleep(ms = 0) {
return new Promise(resolve => setTimeout(resolve, ms));
}
(async () => {
console.log('a');
await sleep(5000);
console.log('b');
})()
ตามที่คาดไว้ การดำเนินการนี้จะเขียน a ไปยังคอนโซล รอ 5 วินาที จากนั้นเขียน b ไปยังคอนโซล
สัญกรณ์ที่สั้นลงโดยใช้ฟังก์ชันลูกศรเพื่อส่งคืน สัญญา
const sleep = ms => { return new Promise(resolve => setTimeout(resolve, ms)) }
(async () => {
console.log('a');
await sleep(5000);
console.log('b');
})()
ตามที่คาดไว้รหัสนี้ทำงานเหมือนกัน a และ b ถูกเขียนไปยังคอนโซลโดยมีช่วงเวลา 5000 มิลลิวินาที อยู่ระหว่างนั้น
รหัสต่อไปนี้ใช้งานไม่ได้ ข้อแตกต่างเพียงอย่างเดียวคือฉันไม่ได้ใส่การส่งคืนของ Promise ในวงเล็บในบรรทัดแรก
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
(async () => {
console.log('a');
await sleep(5000);
console.log('b');
})()
ในกรณีนี้ การรอโหมดสลีปจะไม่ทำงาน ที่จริงแล้วรหัสนี้ไม่ได้ทำอะไรเลยเลย จะไม่บันทึกสิ่งใดลงในคอนโซล ไม่ใช่ a และไม่ใช่ b
ฉันคิดว่าตัวเองมีประสบการณ์พอสมควร แต่ตอนนี้ฉันยังไม่เข้าใจสิ่งนี้ เหตุใดวงเล็บจึงมีความสำคัญในกรณีนี้ ค่าที่ส่งคืนจะเหมือนกันใช่ไหม? และทำไมแม้แต่อักขระ a ถึงไม่ได้รับการบันทึกคอนโซล?
ใครก็ได้โปรดอธิบายให้ฉันฟังอย่างชัดเจนและเจาะจงว่าทำไมถึงเป็นเช่นนี้ นี่เป็นแมลงหรือฉันแค่ต้องการนอนเอง?
ขอบคุณมาก.
function sleep(ms) { return … }
) ซึ่งไม่จำเป็นต้องมีอัฒภาคเลย :-) - person Bergi   schedule 05.08.2017