Promise理解

先上一段网上的代码

setTimeout(function() {
    console.log('timeout1');
})

new Promise(function(resolve) {
    console.log('promise1');
    for(var i = 0; i < 1000; i++) {
        i == 99 && resolve();
    }
    console.log('promise2');
}).then(function() {
    console.log('then1');
})

console.log('global1');

结果 promise1 => promise2 => global1 => then1 => timeout1

简单按优先级划分 => 上下文中的执行代码(如代码中的console.log('promise1')、console.log('global1'))>Promise.then>setTimeout=setInterval

按原理分析 =>    执行顺序 :  宏任务(包括js文件中的执行代码, setTimeout, setInterval等) -> 执行栈(当前运行的栈区) -> 微任务(Promise等)

setTimeout是一个宏任务 即marcotask,所以里面的console.log('timeout1')回调函数会被加到宏任务队列中 但不会立即执行

Promise是一个微任务 即microtask,所以Promise运行执行输出promise1以及promise2Promise.then会被加到微任务队列中 也同样不会立即执行

继续执行 输出console.log('global1') 后执行栈上的代码已经执行完毕,根据上方的执行顺序 此时执行微任务队列,而此时微任务队列上有console.log('then1')因此立即输出

到此为止,一轮的事件循环已经执行完毕,开启新的一轮事件循环 =>即宏任务->执行栈->微任务 由于此时宏任务上有事件console.log('timeout1')因此输出timeout1

猜你喜欢

转载自www.cnblogs.com/zyktbs/p/8889309.html