JS:promise-任务队列和事件循环

事件循环是什么

首先,JavaScript是一门单线程的语言,这并不意味着单线程就是阻塞,而实现单线程非阻塞的方法就是事件循环

 

在JavaScript中,所有的任务都可以分为

  • 同步任务:立即执行的任务,同步任务一般会直接进入到主线程中执行
  • 异步任务:异步执行的任务,比如ajax网络请求,setTimeout定时函数等

 

(1)同步任务

            function fn(){}
            var a=new Array()
            var b=fn()

(2)异步任务

setTimeout(fn,1000)
p1.then(fn)
console.log(123)

实例:

     console.log(4)
        setTimeout(() => {
            setTimeout(() => { console.log(6) }, 0)
            console.log(1)
            var p2 = new Promise((n1, n2) => {
                n1(1000)
            })
            p2.then(() => { console.log(7) })
        }, 0)
        setTimeout(() => {
            setTimeout(() => { console.log(2) }, 200)
            var p3 = new Promise((n1, n2) => {
                n1(1000)
            })
            p3.then(() => { console.log(8) })
            console.log(2)
        }, 0)
        var p1 = new Promise((n1, n2) => {
            n1(1000)
        })
        p1.then(() => { console.log(3) })
        console.log(5)

打印:

4 5 3 1 7 2 8 6 2

解析:

先打印同步任务-->4 5,且将宏任务加入队列中等待,then是一个微任务,执行异步微任务,打印-->3,后第一个宏任务执行打印-->1,执行第一个宏任务中的微任务,打印-->7,此时又进入第二个排队的宏任务,执行并打印-->2,依次执行第二个宏任务中的微任务then,打印-->8,最后进入第一个宏任务中嵌套的第一个宏任务,执行并打印-->6,进入第二个宏任务中嵌套的第一个宏任务,执行并打印-->2。

 

(3)异步任务的队列优先级

异步宏任务先执行 然后在执行异步微任务

(4)开启任务

脚本运行 执行第一个宏任务(脚本就是一个宏任务):

            1. 先执行同步任务
            2.添加新的宏任务到队列中 添加新的的异步微任务
            3.执行异步微任务
 

 

 

 

 

posted on 2022-07-14 16:44  香香鲲  阅读(354)  评论(0)    收藏  举报