最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

node.js中事件循环(EventLoop)的详细介绍(附代码)

来源:动视网 责编:小采 时间:2020-11-27 19:32:08
文档

node.js中事件循环(EventLoop)的详细介绍(附代码)

node.js中事件循环(EventLoop)的详细介绍(附代码):本篇文章给大家带来的内容是关于js中事件循环(EventLoop)的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。前言在学习eventloop之前,我们需要复习一下js的单线程和异步。虽说js是单线程的,但是在浏览器和Node中都
推荐度:
导读node.js中事件循环(EventLoop)的详细介绍(附代码):本篇文章给大家带来的内容是关于js中事件循环(EventLoop)的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。前言在学习eventloop之前,我们需要复习一下js的单线程和异步。虽说js是单线程的,但是在浏览器和Node中都

本篇文章给大家带来的内容是关于js中事件循环(EventLoop)的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

前言

在学习eventloop之前,我们需要复习一下js的单线程和异步。
虽说js是单线程的,但是在浏览器和Node中都做了相应的处理。如浏览器中的web workers(工作线程),Node中的child_process(子进程)。它们的出现对大量计算的分解起到了促进作用。

事件循环

当进程启动时,Node会创建一个tick循环,每个tick循环通过内部的观察者来查看是否有事件需要处理,如果有就取出事件和它相关的回调函数去执行,执行完以后就进入下一个循环,如果不再有就退出进程。

浏览器中的eventloop

在浏览器中把异步事件放到工作线程中,避免阻塞主线程UI的渲染

 console.log('进程开始')
 const ajax = new XMLHttpRequest()
 ajax.addEventListener('load', () => {
 console.log('load')
 })
 ajax.addEventListener('loadend', () => {
 if (ajax.readyState == 4 && ajax.status == 200) {
 console.log('ajax success')
     } else {
 console.log('ajax success')
     }
 })
 ajax.open('get', 'http://localhost/study/html/vue.js')
 ajax.send()
 setTimeout(() => {
 console.log('setTimeout')
 }, 300)
 fetch('http://localhost/study/html/demo.json',{
 headers: {
 'content-type': 'application/json'
 }
 }).then(res => {
 console.log('fetch')
 })
 let i = 0
 while(i < 10000) {
 i++
 }
 console.log(i)
 console.log('进程结束')

从结果可以看出三种异步处理不阻塞主线程代码的执行,而ajax、fetch、setTimeout根据代码处理结束的先后来执行回调函数。

Nodejs中的eventloop

Node中的事件循环根据观察者的优先级来执行,同一个循环内的process.nextTick -> setTimeout -> setImmediate

setTimeout(() => {
 console.log('setTimeout')
}, 0)
setImmediate(() => {
 console.log('setImmediate1')
 process.nextTick(() => {
 console.log('setImmediate1 插入nextTick')
 })
})
setImmediate(() => {
 console.log('setImmediate2')
})
process.nextTick(() => {
 setTimeout(() => {
 console.log('nextTick1 setTimeout')
 }, 100)
 console.log('nextTick1')
})
process.nextTick(() => {
 console.log('nextTick2')
})
console.log('正常执行')

总结

事件循环的执行特点,源于利用单线程,远离多线程死锁、状态同步等问题;利用异步让单线程远离阻塞,以更好的使用CPU。

相关推荐:

细说JavaScript事件循环机制-第二讲

深入理解Node.js 事件循环和回调函数

文档

node.js中事件循环(EventLoop)的详细介绍(附代码)

node.js中事件循环(EventLoop)的详细介绍(附代码):本篇文章给大家带来的内容是关于js中事件循环(EventLoop)的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。前言在学习eventloop之前,我们需要复习一下js的单线程和异步。虽说js是单线程的,但是在浏览器和Node中都
推荐度:
标签: 事件 js 代码
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top