异步代码async await阻塞进程的误区——await的是Promise的resolve而不是语句块的执行结束
阻塞失效?
考虑下面的语句块
var f = async function(){
await setTimeout(()=>{console.log(1)}, 3000);
console.log(2);
}
f();
结果先打印出了2,随后打印出了1,看似并没有阻塞等待;然而,殊不知只要setTimeout该函数注册完成就算该异步代码完成,可以继续进行下面的代码。
下面看一个菜鸟教程教程中的例子
function testAwait (x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 2000);
});
}
async function helloAsync() {
var x = await testAwait ("hello world");
console.log(x);
}
helloAsync ();
这里等待的(await)就是真正的异步代码,仅当Promise对象resolve后才算异步代码完成,才可以继续下面的代码。