曲靖网站制作一条龙,赣州章贡区邮政编码是多少,云虚拟主机免费,网页qq登录记录网站node环境
Event Loop各阶段#xff1a;
- timers 阶段#xff1a;这个阶段执行 setTimeout 和 setInterval 的回调函数。- I/O callbacks 阶段#xff1a;不在 timers 阶段、close callbacks 阶段和 check 阶段这三个阶段执行的回调#xff0c;都由此阶段负责#xff0c… node环境
Event Loop各阶段
- timers 阶段这个阶段执行 setTimeout 和 setInterval 的回调函数。- I/O callbacks 阶段不在 timers 阶段、close callbacks 阶段和 check 阶段这三个阶段执行的回调都由此阶段负责这几乎包含了所有回调函数。- idle, prepare 阶段译注看起来是两个阶段不过这不重要event loop 内部使用的阶段译注我们不用关心这个阶段- poll 阶段获取新的 I/O 事件。在某些场景下 Node.js 会阻塞在这个阶段。- check 阶段执行 setImmediate() 的回调函数。- close callbacks 阶段执行关闭事件的回调函数如 socket.on(close, fn) 里的 fn
nextTick会在当前阶段执行完马上执行。
nextTick 既属于宏任务也属于微任务,主要是由他的实现方式决定的。 nexTick 实现方式是 promise,属于微任务,但是由于 IE 浏览器没有 promise,所以使用定时器的方式实现的,这又属于宏任务了。一般情况是微任务。 setImmediate是宏任务只不过是比setTimeout要更快执行的宏任务。
主要记住三个阶段
times存放setTimeout、setInterval 宏任务的队列poll等待nextTick在当前阶段的尾部执行checksetImmediate会存在这个队列中
eventloop会在不停的循环执行这些阶段当没有任务时它会停留在poll阶段。实际上大部分时间是停留在poll阶段的因此setImmediate往往会优先于setTimeout先执行。
console.log(1);setTimeout(() {console.log(3);
}, 0);async function async1() {console.log(4);await async2();console.log(5);
}async function async2() {console.log(6);
}async1();new Promise(function(resolve) {console.log(7)resolve();
}).then(function() {console.log(8)
});process.nextTick(function() {console.log(2);
});console.log(9);// 微任务队列 5 8
// 宏任务队列 3
// nextTick是当前阶段尾部process.nextTick是在当前同步代码中调用的也就是说同步代码执行完
// 会立即执行nextTick打印出2
// 1 4 6 7 9 2 5 8 3
浏览器环境
在浏览器环境中只需要区分宏任务和微任务即可微任务如promise由于宏任务setTimeout先执行注意new Promise()是立即同步执行的只有promise.then()里的内容是微任务。如果遇到await写法可以改写为promise.then()然后来判断。
await是一个语法糖await后面是一个返回promise的函数如果函数里没有返回promise它会自动封装为一个返回promise的函数。
简单来说宏任务是一会儿执行的微任务是马上执行的执行顺序显而易见。
async function foo() {console.log(foo)
}
async function bar() {console.log(bar start)await foo()console.log(bar end)
}console.log(script start)
setTimeout(function () {console.log(setTimeout)
}, 0)bar();new Promise(function (resolve) {console.log(promise executor)resolve();
}).then(function () {console.log(promise then)
})
console.log(script end) // 微任务 马上 bar end、promise then、
// 宏任务 一会儿 setTimeout、
/*
script start
bar start
foo
promise executor
script end
bar end
promise then
setTimeout、*/