Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ซอฟต์แวร์ >> เบราว์เซอร์

เชี่ยวชาญ queueMicrotask ของ JavaScript: คู่มือฉบับสมบูรณ์

บทนำ

queueMicrotask เป็น API เบราว์เซอร์ใหม่ที่สามารถใช้แปลงโค้ดซิงโครนัสของคุณให้กลายเป็นอะซิงโครนัส:

queueMicrotask(() => { console.log('hey i am executed asychronously by queueMicrotask'); });

มันคล้ายกับสิ่งที่เราทำด้วย setTimeout:

setTimeout(() => { console.log('hey i am executed asychronously by setTimeout'); }, 0);

ดังนั้น queueMicrotask 有什么用 כשเรามี setTimeout อยู่แล้ว?

queueMicrotask เพิ่มฟังก์ชัน (งาน) เข้าไปในคิว และแต่ละฟังก์ชันจะถูกดำเนินการทีละอัน (FIFO) หลังจากงานปัจจุบันเสร็จสิ้น และเมื่อไม่มีโค้ดอื่นรอให้รันก่อนที่การควบคุมบริบทการดำเนินการจะถูกคืนให้ event loop ของเบราว์เซอร์

โดยพื้นฐาน งานของ queueMicrotask จะถูกดำเนินการทันทีหลังจาก call stack ว่างเปล่า ก่อนที่จะส่งการควบคุมไปที่ event loop

ในกรณีของ setTimeout แต่ละงานจะถูกดำเนินการจาก event queue หลังจากที่การควบคุมถูกส่งให้ event loop

ดังนั้น หากเรารัน setTimeout ก่อน แล้วตามด้วย queueMicrotask ตัวไหนจะถูกเรียกก่อน? ลองรันโค้ดด้านล่างและตรวจสอบด้วยตัวเอง:

setTimeout(() => { console.log('hey i am executed asychronously by setTimeout'); },0); queueMicrotask(() => { console.log('hey i am executed asychronously by queueMicrotask'); }); 

Node.js ทำสิ่งเดียวกันกับ "process.nextTick"

เมื่อไหร่ควรใช้ มัน

ไม่มีกฎเกณฑ์สำหรับเมื่อควรใช้ queueMicrotask, แต่มันสามารถใช้ได้อย่างฉลาดเพื่อรันชิ้นโค้ดหนึ่งโดยไม่หยุดการดำเนินการปัจจุบัน

ตัวอย่างเช่น สมมติว่าเรามีอาร์เรย์ที่เราเก็บรายการค่า หลังจากแทรกค่าแต่ละครั้ง เราจัดเรียงอาร์เรย์เพื่อให้การค้นหาค่าเร็วขึ้น

var arr=[]; function add(value){ arr.push(value); arr.sort(); }

อย่างไรก็ตาม การค้นหาองค์ประกอบทำเมื่อใครใช้กล่องค้นหา หมายความว่า event handler จะถูกเรียกหลังจากการควบคุมถูกส่งให้ event loop ดังนั้น การจัดเรียงข้อมูลจึงบล็อกการดำเนินการโค้ดซิงโครนัสสำคัญอื่นๆ

นี่คือวิธีที่เราสามารถใช้ queueMicrotask เพื่อปรับปรุงโค้ดของเรา:

var arr = []; function add(value) { arr.push(value); queueMicrotask(() => { arr.sort(); }) }

อ้างอิง

  • https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/queueMicrotask