异步代码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后才算异步代码完成,才可以继续下面的代码。

posted @ 2020-09-11 10:44  Bravo_Jack  阅读(896)  评论(0编辑  收藏  举报