前端面试题(事件循环)

文章详细阐述了JavaScript中的事件循环机制,包括同步和异步代码的执行顺序,Promise的.then和.catch的异步性质,微任务和宏任务的区别,以及在不同示例中的执行流程。重点讨论了Promise和setTimeout在事件循环中的行为,并通过async/await的例子解释了异步函数的处理方式。
摘要由CSDN通过智能技术生成

注: 今日全部是事件循环 ,如有错误请大家指出 我会及时改正

我们的代码分为同步代码异步代码:

其中异步代码有定时器 ,延时器 ,ajax,Fetch,事件绑定以及promise中的.then和.catch 等等

但是需要注意: promise本身是同步的 但是.then 和 .catch 是异步的

同步代码会直接交给js引擎去工作 ,放入执行栈中立即执行 ,但是异步代码会先放入宿主环境(浏览器或者node)中,不必等待结果,防止阻塞代码,在不阻塞主线程任务执行的时候 ,推送给任务队列。

所以  ,当执行栈中的同步代码执行完毕,会去任务队列中查看是否有异步任务,有的话就按先进先出的原则推送到执行栈中,执行栈反复进行查看执行的这个过程,就叫做事件循环

异步任务分为微任务和宏任务 

微任务是有Js引擎发起的 比如说 Promise的 .then,process.nextTick 这种 ,而宏任务是 有宿主环境发起的 比如setTimeOut/setInterval 

new Promise((resolve, reject) => {
    resolve(1);
    new Promise((resolve, reject) => {
        resolve(2);
    }).then((data) => {
        console.log(data);
    })
}).then((data) => {
    console.log(data);
})
console.log(3);

结果 :  3 2 1


const fn = () =>
  new Promise((resolve, reject) => {
    console.log(1);
    resolve("success");
  });
console.log("start");
fn().then(res => {
  console.log(res);
});

结果:start  1   success



setTimeout(() => {
    console.log(1);
}, 0)
new Promise((resolve, reject) => {
    console.log(2);  // ==>  2
    resolve('p1')
    new Promise((resolve, reject) => {
        console.log(3); // ==>  3
        setTimeout(() => {
            resolve('setTimeout2')
            console.log(4);
        }, 0)
        resolve('p2')
    }).then(data => {
        console.log(data);
    })
    setTimeout(() => {
        resolve('setTimeout1')
        console.log(5);
    }, 0)
}).then(data => {
    console.log(data);
})
console.log(6);

 结果:2 3 6 p2 p1 1 4 5



async function async1(){
    console.log('async1 star');
    await async2();
    console.log('async1 end');

}
async function async2(){
    console.log('async2');

}
console.log('script star');
setTimeout(function(){
    console.log('settimeout');
},0)
async1();

结果 :

script star

async1 star
async2
async1 end
settimeout 

 



注意点:

其实 在第二道题我一直没弄明白为什么 setTomout中的resolve 不再执行了 ,后来自己理解是相当于resolve是一种结果 ,每个.then 只能执行一次?所以 一个promise中的resolve只能匹配第一个resolve?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值