ควรเขียนโค้ดที่ไม่ต้องพึ่งพาช่วงเวลาของการโทรกลับทันที (เช่น 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 .thenon the Promise ที่ได้รับการแก้ไขนั้นแตกต่างจากพฤติกรรมของการsetTimeoutโทรกลับทันที- Promise .thenจะทำงานก่อนแม้ว่าจะsetTimeoutถูกจัดคิวก่อน แต่เบราว์เซอร์ที่ทันสมัยเท่านั้นที่สนับสนุนสัญญา วิธีสามารถพิเศษการทำงานของ microtask คนหนึ่ง polyfilled ถูกต้องหากPromiseไม่อยู่?
หากคุณพยายามเลียนแบบ.thenmicrotask โดยใช้setTimeoutคุณจะต้องรอคิว macrotask ไม่ใช่ microtask ดังนั้นโพลีฟิลที่ไม่ดี.thenจะไม่ทำงานในเวลาที่ถูกต้องหาก macrotask ถูกจัดคิวไว้แล้ว
มีวิธีแก้ปัญหาโดยใช้ MutationObserverแต่ดูน่าเกลียดและไม่ใช่MutationObserverสำหรับ นอกจากนี้MutationObserverไม่รองรับ IE10 และรุ่นก่อนหน้า หากใครต้องการคิว microtask ในสภาพแวดล้อมที่ไม่สนับสนุน Promises มีทางเลือกอื่นที่ดีกว่านี้หรือไม่?
(ฉันไม่จริงพยายามสนับสนุน IE10 - นี่เป็นเพียงแบบฝึกหัดทางทฤษฎีว่า microtasks สามารถเข้าคิวโดยไม่มีสัญญาได้อย่างไร)
schedule.jsความเป็นมาของมันจะเป็นความกระจ่าง