ควรเขียนโค้ดที่ไม่ต้องพึ่งพาช่วงเวลาของการโทรกลับทันที (เช่น microtasks vs macrotasks) แต่ลองทิ้งไว้สักครู่
setTimeout
รอคิว macrotask ซึ่งอย่างน้อยก็รอให้เริ่มจนกว่า microtasks ทั้งหมด (และ microtasks ที่วางไข่) จะเสร็จสิ้น นี่คือตัวอย่าง:
console.log('Macrotask queued');
setTimeout(function() {
console.log('Macrotask running');
});
Promise.resolve()
.then(function() {
console.log('Microtask running');
});
console.log('Microtask queued');
console.log('Last line of script');
พฤติกรรมของ a .then
on the Promise ที่ได้รับการแก้ไขนั้นแตกต่างจากพฤติกรรมของการsetTimeout
โทรกลับทันที- Promise .then
จะทำงานก่อนแม้ว่าจะsetTimeout
ถูกจัดคิวก่อน แต่เบราว์เซอร์ที่ทันสมัยเท่านั้นที่สนับสนุนสัญญา วิธีสามารถพิเศษการทำงานของ microtask คนหนึ่ง polyfilled ถูกต้องหากPromise
ไม่อยู่?
หากคุณพยายามเลียนแบบ.then
microtask โดยใช้setTimeout
คุณจะต้องรอคิว macrotask ไม่ใช่ microtask ดังนั้นโพลีฟิลที่ไม่ดี.then
จะไม่ทำงานในเวลาที่ถูกต้องหาก macrotask ถูกจัดคิวไว้แล้ว
มีวิธีแก้ปัญหาโดยใช้ MutationObserver
แต่ดูน่าเกลียดและไม่ใช่MutationObserver
สำหรับ นอกจากนี้MutationObserver
ไม่รองรับ IE10 และรุ่นก่อนหน้า หากใครต้องการคิว microtask ในสภาพแวดล้อมที่ไม่สนับสนุน Promises มีทางเลือกอื่นที่ดีกว่านี้หรือไม่?
(ฉันไม่จริงพยายามสนับสนุน IE10 - นี่เป็นเพียงแบบฝึกหัดทางทฤษฎีว่า microtasks สามารถเข้าคิวโดยไม่มีสัญญาได้อย่างไร)
schedule.js
ความเป็นมาของมันจะเป็นความกระจ่าง