新手的一个async问题?
发布于 8 年前 作者 beilunyang 3424 次浏览 来自 问答

上代码:

function sleep() {
  console.log('sleep start');
  const p = Promise.resolve(); // p是一个resolved的promise对象
  return p.then( () => {
    setTimeout(console.log.bind(console, 'sleep 1000ms'), 1000);
  });  //return 一个新的promise对象
}
async function init() {
  console.log('init start');
  await sleep();
  console.log('init end');
}
init(); 

以上运行结果为:

init start
sleep start
init end
sleep 1000ms

而将sleep函数写成如下形式:

   function sleep() {
	  return new Promise((resolve, reject) => {
	    setTimeout(() => {
		  console.log('sleep 1000ms');
		  resolve();
		}, 1000);
	  });
	} 

则运行结果为:

init start
sleep start
sleep 1000ms
init end   
// 正是预料中的结果

新人,对异步理解不透彻,请各位大佬解释一下运行结果为什么会不同?(我觉得执行结果应该一样啊╮(╯▽╰)╭)跪谢!

2 回复

两种情况下,await后面的promise被resolved的时机不一样。

详细说:

关键就是看await后面返回的promise对象什么时候被resolved。一个是setTimeout函数返回的时候,一个是在setTimeout函数的回调函数被调用的时候。

来自酷炫的 CNodeMD

@manxisuo 辛苦了。很简单的问题,当时怎么就想不通呢!(滑稽脸)

回到顶部