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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM