开启掘金成长之旅!这是我参与「掘金日新计划 · 2更文挑战」的第7天 点击查看活动详情
前言
新的一年面试开始了,去年裁员的室友开始面试了,行情不好,去了一家银行的外包试试水,不知道结果怎么样,今天看他往群里发了一道题,今天就拿来讲讲。(慎重去外包/慎重去外包/慎重去外包)
考察内容: promise+async
代码如下(代码A):
function takeTime(i) {
return new Promise(resolve => {
console.timeLog('log', i * 10);
setTimeout(() => resolve(i), 6000);
});
}
async function printOut(i) {
const v = await takeTime(i);
console.timeLog('log', v);
}
async function go() {
console.time('log');
return new Promise(resolve => {
for (let i = 1; i <= 3; i++) {
setTimeout(() => {
printOut(i);
}, 1000 * i);
}
setTimeout(() => resolve(), 10000); // 怎么判断全部结束更好?
})
}
await go().then(() => console.timeEnd('log')); // 怎么样的输出,为什么? await/async可不可以拿走,为什么?"
async/await
- async 表示这是一个async函数, await只能用在async函数里面,不能单独使用
- async 返回的是一个Promise对象,await就是等待这个promise的返回结果后,再继续执行
- await 等待的是一个Promise对象,后面必须跟一个Promise对象,但是不必写then(),直接就可以得到返回值
await go().then(() => console.timeEnd('log')); // 怎么样的输出,为什么?
所以这行纯粹是搞事情,运行起来是会报错的。
举个例子(代码B)
let asyncFun = async function(){
return 6666
}
console.log(asyncFun()) // asyncFun返回一个promisse对象
//摇号
function dice(){
return new Promise((resolve)=>{
let sino = parseInt(Math.random()*10+1) //生成一个1~10之间的随机小数
setTimeout(()=>{
resolve(sino)
},2000)
})
}
//异步方法
async function text(){
let n= await dice() // 利用await,当dice执行完之后才会将获得值赋n, 只能当n取得值时,才会执行最后的一步打印
console.log("摇出来"+n) //最后打印出摇出来的数
}
text()
打印结果:
通过代码B就可以很容易的看出代码A是存在一定的问题,所以go前的await是必须要去除的。
代码A实际的运行情况如下: