记一次朋友的面试

61 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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

  1. async 表示这是一个async函数, await只能用在async函数里面,不能单独使用
  2. async 返回的是一个Promise对象,await就是等待这个promise的返回结果后,再继续执行
  3. 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()

打印结果:

image.png

通过代码B就可以很容易的看出代码A是存在一定的问题,所以go前的await是必须要去除的。

代码A实际的运行情况如下:

1677146277789.png