新手的一个async问题?
发布于 9 年前 作者 beilunyang 4300 次预览 最后一次回复是 9 年前 来自 问答
上代码:
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 辛苦了。很简单的问题,当时怎么就想不通呢!(滑稽脸)