nodejs-第二章-第一节-浏览器事件循环

第一章:事件循环介绍:

  • 浏览器中的事件循环:javascript

    • 为了协调事件(event),用户交互(user interaction),脚本(script),渲染(rendering),网络(networking)等,用户代理(user agent)必须使用 事件循环(event loops).
    • 事件:PostMessage(多个页面通讯),MutationObserver(dom监听)等
    • 用户交互:click,onScroll等
    • 渲染:解析dom,css等
    • 脚本:执行脚本
  • nodejs中的事件循环css

    • 事件循环容许Node.js执行非阻塞I/O操做,尽管JavaScript是单线程的,经过尽量将操做卸载到系统内核,因为大多数现代内核都是多线程的,所以 他们能够处理在后台执行的多个操做。当其中一个操做完成时,内核会告诉Nodejs,以即可以将相应的回调添加到轮询队列中以最终执行。
    • 事件:EventEmitter
    • 非阻塞I/O: 网络请求,文件读写等
    • 脚本: js执行脚本
  • 事件循环的本质java

    • 在浏览器或者nodejs环境中,运行时对js脚本的调度方式就叫事件循环
setTimeout(()=>{
    console.log('setTimeout')
},0)
Promise.resolve().then(() =>{
    console.log('promise')
})
console.log('main')
// main  promise  setTimeout

第二章:浏览器事件循环

  • javascript为何是单线程的?node

    • 浏览器js的做用是操做DOM,这决定了它只能是单线程,不然会带来很复杂的同步问题。好比,假定javascript同时有两个线程,一个线程在某个DOM 节点上添加内容,另外一个线程删除了这个节点,这时浏览器不知道以哪一个线程为主。
  • 任务队列面试

    • 单线程意味着全部任务须要排队,若是由于任务cpu计算量大还好,可是I/O操做cpu是闲着的。因此js就设计成了一门异步语言,不会作无谓的等待。
    • 任务能够分红两种,一种是同步任务,另外一种是异步任务。
    • 全部同步任务都在主线程上执行,造成一个执行栈。
    • 主线程以外,还存在一个任务队列。只要异步任务有了运行结果,就在任务队列之中放置一个事件。
    • 一旦执行栈中的全部同步任务执行完毕,系统就会读取任务队列,看看里面有哪些事件。那些对应的异步任务,因而结束等待状态,进入执行栈,开始执行。
    • 主线程不断重复上面的第三步
    • 主线程从任务队列中读取事件,这个过程是循环不断的,因此整个的这种运行机制又称 Event Loop(事件循环)
  • 宏任务和微任务promise

    • 除了广义的同步任务和异步任务,javaScript单线程中的任务能够细分为 宏任务和微任务。
    • macrotask(宏任务): script(总体代码),setTimeout, setInterval, setImmediate, I/O, UI rendering
    • microtask(微任务):process.nextTick, Promise, Object.observe, MutationObserver 1.宏任务进入主线程,执行过程当中会搜集微任务加入微任务队列。 2.宏任务执行完成以后,立马执行微任务中的任务。微任务执行过程当中将再次收集宏任务,并加入宏任务队列 3.反复执行1,2
  • 事件循环:每执行完一轮宏任务和微任务就叫作一环事件;浏览器

高频面试题
  • 一轮事件循环会执行一次宏任务以及全部的微任务
setTimeout(() => {
    console.log('setTimeout')
    setTimeout(() => {
       console.log('setTimeout2')
    },0)
},0)

Promise.resolve().then(() =>{
    console.log('Promise')
    Promise.resolve().then(() =>{
      console.log('Promise2')
    })
})

console.log('main')
// main  promise promise2 setTimeout
  • 任务队列必定会保持先进先出的顺序执行,没次只能执行一个红任务!!!·
setTimeout(() => { // 两个setTimeout谁先进的话 谁就先出
    console.log('setTimeout')
    Promise.resolve().then(() =>{
      console.log('promise')
    })
},0)

Promise.resolve().then(() =>{
    console.log('promise2')
    setTimeout(() => {
       console.log('setTimeout2')
    },0)
})

console.log('main')
// main promise2 setTimeout  promise  setTimeout2
new Promise((res, rej) =>{
    console.log(1)
    res()
  }).then(() =>{
    console.log(2)
    new Promise((res,rej) =>{
      console.log(3)
      res()
    }).then(() =>{
      console.log(4)
    }).then(() =>{
      console.log(5)
    }).then(() =>{
      console.log(6)
    })
  }).then(() =>{
      console.log(7)
    })
    .then(() =>{
      console.log(8)
    })
// 1 2 3 4 7 5 8 6
相关文章
相关标签/搜索