event loop

98 阅读1分钟
  • JS 是一个单线程语言
  • 异步和多线程是通过event loop 事件循环机制 来实现的
  • 1.调用栈(call stack)
  • 2.消息队列 (message queue)
  • 3.微任务队列 (microtask queue)
最开始的时候在全局调用栈中 一行一行执行
遇到函数执行会把它压入调用栈中;当函数返回后(执行完之后)会从调用栈中移出

定时器 会被扔到消息队列中,消息队列会再调用栈清空的时候才去执行
  created () {
    this.fun2()
  },
  methods: {
    fun1 () {
      console.log(1);
    },
    fun2 () {
      setTimeout(() => {
        console.log(2);
      }, 0)
      this.fun1()
      console.log(3);
    }
  }
  上面代码 调用func2  输出的是 1 3 2
  分析:func2从上到下执行 
  遇到定时器,扔进消息队列中 不会被立即执行尽管设置的是0秒
  执行func1  打印1
  打印3
  调用栈中没有可执行的东西了 消息队列中的内容被压入调用栈中 执行定时器打印2 清空调用栈
  1 3 2
  • 使用Promise async awite 这些异步会被压入微任务队列执行
微任务队列原理和定时器一样  优先级高于 消息队列
调用栈清空的时候先去执行微任务队列中的任务 --- 之后消息队列中的任务
created () {
    this.p = new Promise(resolve => {
      console.log(4);
      resolve(5)
    })
    this.fun2()

  },
  methods: {
    fun1 () {
      console.log(1);
    },
    fun2 () {
      setTimeout(() => {
        console.log(2);
      })
      this.fun1()
      console.log(3);
      this.p.then(resolved => {
        console.log(resolved);
      })
        .then(() => {
          console.log(6);
        })
    }
  }
 分析1.首先Promise 压入调用栈 执行 打印 4
 	2.resolve(5) 进入微任务队列  等待执行
    3.执行func2  定时器进入消息队列 等待执行
    4.调用func1  打印 1  func1移出调用栈
    5.打印 3 
    6.调用栈清空   开始执行微任务队列  打印 5 6
    7.最后执行消息队列   打印2  
    结果是 4 1 3 5 6 2