首先,await不会阻塞主线程,而是在同步方法中实现异步的逻辑。
代码演示:
// 异步请求逻辑处理
async function test_sync(max = 1){
return new Promise(function(resolve, reject) {
setTimeout(function(){
for(var i=0;i<max;i++){
console.log(i);
}
resolve(max);
}, 2000);
});
}
// test方法中使用await同步的语法
async function test(max){
console.info("test start");
await test_sync(max); // 同步逻辑
console.info("test end");
}
// 调用test(10)方法,返回Promise对象;
test(10);
// 测试主线程打印日志
console.log("main start");
console.log("main end");
执行代码结果:
红色方框是同步实现的异步代码执行结果,绿色方框是主线程的执行。从中可以看到:
1.在遇到await test_sync(max) 时,没有立即打印“test end”,说明在此处等待请求响应。
2.绿色日志“main start”和main end先打印,说明主线程已执行完成
3.接着输出异步请求打印的日志0-9
4.最后打印test end日志。
分析:
await test_sync(max); // 同步逻辑
console.info("test end");
上面的两行代码类似于以下写法:
test_sync(max).then(function(){
console.info("test end");
});
相当于在promise成功的回调函数中执行await之后的代码。