JS任务执行Demo解释

316 阅读1分钟

由于js单线程的特性,当多个任务同时执行时,碰到异步时,不可避免的会面临着谁先谁后的问题,这就涉及到js排队执行机制。机制自己去百度,然后上这里直接看代码。

console.log('a');
new Promise(resolve => {
    console.log('b')
    resolve()
}).then(() => {
    console.log('c')
    setTimeout(() => {
      console.log('d')
    }, 0)
})

setTimeout(() => {
    console.log('e')
    new Promise(resolve => {
        console.log('f')
        resolve()
    }).then(() => {
        console.log('g')
    })
}, 100)

setTimeout(() => {
    console.log('h')
    new Promise(resolve => {
        resolve()
    }).then(() => {
        console.log('i')
    })
    console.log('j')
}, 0)

答案:a,b,c,h,j,i,d,e,f,g

js执行逻辑如下,第一步扫描执行上下文,同步任务立即执行,于是有了a,b,异步任务放入宏任务队列(promise.then是微任务会先于settimeout执行,于是有了c,then里面的setTimeout则被压入宏任务队列)。第二步主进程依优先级拿出宏任务队列之一,开始执行,第三个setTimeout 0秒优先级最高,于是有了h,先同步再异步,于是先j,后i。然后是第一个promise里面的setTimeout 0秒执行优先级最高,于是有了d,最后是第二个setTimeout 100毫秒执行,先同步后异步,所以有e,f,g。 简单明了。