Open ChenPt opened 2 years ago
今天中午做了一个打卡的题目,LazyMan,题目大概是
LazyMan('Peter').sleep(5).eat(dinner) // 输出如下 // Hi Peter! // (间隔了5s) // wake up after 5 // eat dinner LazyMan('Juily').eat('lanuch').sleepFirst(5) // 输出如下 // (间隔了5s) // wake up after 5 // Hi Juily! // eat lanuch
const log = console.log const sleepTask = (d) => () => new Promise((resolve) => setTimeout(() => resolve(log(`Wake up after ${d}`)), d * 1000)) function LazyMan(name) { const ctx = { sleep: (d) => { tasks.push(sleepTask(d)) return ctx }, sleepFirst: (d) => { tasks.unshift(sleepTask(d)) return ctx }, eat: (s) => { tasks.push(() => log(`Eat ${s}`)) return ctx }, } const tasks = [() => log(`Hi! This is ${name}!`)] const run = () => { // 通过setTimeout来生成一个macrotask。依次执行当前tasks里存储的任务 setTimeout(async () => { while(tasks.length) { await tasks.shift()() } }, 0) } run() return ctx }
在 JavaScript 中可以通过 queueMicrotask() 使用微任务,浏览器和nodejs宿主环境都支持这个api,node >= 11.0,浏览器的支持情况如下图 所以以后为了创建异步任务,无需再用setTimeout了,尽管使用queueMicrotask来创建一个microtask吧
queueMicrotask
microtask
今天中午做了一个打卡的题目,LazyMan,题目大概是
在 JavaScript 中可以通过 queueMicrotask() 使用微任务,浏览器和nodejs宿主环境都支持这个api,node >= 11.0,浏览器的支持情况如下图 所以以后为了创建异步任务,无需再用setTimeout了,尽管使用
queueMicrotask
来创建一个microtask
吧