CNode

新手的一个async问题?

问答
Bbeilunyang发布于10 年前最后回复10 年前2 回复4478 浏览0 收藏

上代码:

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)

M
manxisuo#2·10 年前

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

详细说:

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

来自酷炫的 CNodeMD

参与回复
登录后即可参与回复。登录