问题:请你实现一个等待函数,例如先打印“吃早饭”,休眠2秒钟,再打印“吃午饭”,再休眠2秒钟,打印“吃晚饭”的代码。
目录
1 通过这道题可以想到哪些场景?
这道题虽然是说固定的休息2秒钟,再做一件事情,但其实可以想到一些场景。而且面试中,题目也不会一沉不变的,面试官一定会把题目扭转来去,各种各样。
休眠2秒钟,但如果是3秒呢,或者不确定多少秒呢,是不是很像我们说的异步请求。比如先打印了“吃早饭”,然后发送一个异步请求,当请求成功了才能继续吃午饭,而没有请求成功延迟了,是不是吃午饭的时间就得靠后一些呢?
再比如,这个休眠时间不是固定的2秒钟呢,需求规定,第一次休眠2秒可以吃午饭,吃完了午饭,要休眠5秒才能吃晚饭呢?
2 简单实现一下
如果不加异步请求,我们首先可以想到利用setTimeout来实现,多久后执行一次,正适合模拟这个场景。
<script>
console.log('吃早饭');
setTimeout(() => {
console.log('吃午饭');
setTimeout(() => {
console.log('吃晚饭');
}, 5000)
}, 2000)
</script>
其实这样写,最灵活,你想怎么给我出题我都可以搞定,不就是弄出了个回调地狱嘛,但很明显,回调地狱是大家在开发中,越来越规避的问题。
而且就算开发需求中,没人管你,你自己开发,想怎么回调怎么回调,但面试中,自己一定是优秀的,自己日常不注意的东西没人管,但面试中一定调整好自己,哪怕面试完了自己再自由飞翔敲代码呢。
3 改进一下
<script>
const sleep = (time) => {
return new Promise((resolve, rejuect) => {
setTimeout(() => {
resolve('You can eat!');
}, time)
})
}
const wantEat = async () => {
console.time();
console.log('吃早饭');
await sleep(2000);
console.log('吃午饭');
await sleep(5000);
console.log('吃晚饭');
console.timeEnd()
}
wantEat();
</script>
这里使用了 async/await + promise的配合,通过await使程序顺序执行 ,当promise正常返回后才开始继续向下执行。
4 其他场景
这道题不光考怎么样可以顺序执行一些代码,sleep不就是希望程序可以等待后,再继续执行嘛。比如我们在做后端开发的时候,当你从数据库的一张表里查到id,下面拿着id继续去别的表里查数据,这个时候await就特别有用处。