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