async await的作用和执行顺序,EventLoop 事件循环机制

268 阅读2分钟

async await的作用和执行顺序,EventLoop 事件循环机制

  • async
    async 是“异步”的简写, async 用于申明一个异步的 function,如果函数内部无await关键词执行起来等同于普通函数。

  • await
    await 可以认为是 async wait 的简写,await 用于等待一个异步方法执行完成。await关键字右侧函数执行完成,async函数内后续的代码会被阻塞,先去执行async函数外的代码。等外面的同步代码执行完毕,才会执行函数内的后续代码。

async function async1() {
	console.log('async1 start');
	await async2();
	console.log('asnyc1 end');
}
async function async2() {
	console.log('async2');
}
console.log('script start');
async1();
console.log('script end');

执行结果

script start
async1 start
async2
script end
asnyc1 end

EventLoop

Event Loop顾名思义:“事件循环”,是指浏览器或Node环境的一种解决javaScript单线程运行时阻塞问题的一种机制,也就是实现异步的原理。
js是单线程,所以js执行任务时要一个一个顺序执行。如果一个任务耗时过长,那么后一个任务也必须等着。那么问题来了,假如我们购物逛淘宝时,高清图片很多,加载很慢,难道我们的网页要一直卡着直到图片完全显示出来?答案是否定的。于是,事件就被分为了:
1.同步事件
2.异步事件
异步事件又包含:宏任务(macrotask),微任务(microtask);

  • 宏任务(macrotask)
    script
    setTimeout
    setInterval
    setImmediate(Node.js 环境)
    IO操作
    UI交互事件
    postMessage
    MessageChannel

  • 微任务(microtask)
    promise.[ then/catch/finally ]((非new Promise))
    process.nextTick(Node.js 环境)
    MutaionOberver(浏览器环境)
    Object.observe

console.log('script start');

setTimeout(function () {
    console.log('setTimeout---0');
}, 0);

setTimeout(function () {
    console.log('setTimeout---200');
    setTimeout(function () {
        console.log('inner-setTimeout---0');
    });
    Promise.resolve().then(function () {
        console.log('promise5');
    });
}, 200);

Promise.resolve().then(function () {
    console.log('promise1');
}).then(function () {
    console.log('promise2');
});
Promise.resolve().then(function () {
    console.log('promise3');
});
console.log('script end');

执行结果

script start
script end
promise1
promise3
promise2
setTimeout---0
setTimeout---200
promise5
inner-setTimeout---0