async 一道经典面试题

经典面试题
async function async1(){
    console.log('async1 start')
    await async2()
    console.log('async1 end')
}
async function async2(){
    console.log('async2')
}
console.log('script start')
setTimeout(function(){
    console.log('setTimeout')
},0)  
async1();
new Promise(function(resolve){
    console.log('promise1')
    resolve();
}).then(function(){
    console.log('promise2')
})
console.log('script end')
答案
script start
async1 start
async2
promise1
script end
promise2
async1 end
setTimeout

4、分析过程

1.定义一个异步函数 async1
2.定义一个异步函数 async2
3.打印 ‘script start’ // *1
4.定义一个定时器(宏任务,优先级低于微任务),在0ms 之后输出
5.执行异步函数 async1

1.打印 'async1 start' // *2
2.遇到await 表达式,执行 await 后面的 async2
    2.1打印 'async2' // *3
 3.返回一个 Promise,跳出 async1 函数体

6.执行 new Promise 里的语句

1.打印 ‘promise1‘	// *
2.resolve() , 返回一个 Promise 对象,把这个 Promise 压进队列里

7.打印 ’script end’ // *
8.同步栈执行完毕
9.回到 async1 的函数体,async2 函数没有返回 Promise,所以把要等async2 的值 resolve,把 Promise 压进队列
10.执行 new Promise 后面的 .then,打印 ’promise2‘ // *6
11.回到 async1 的函数体,await 返回 Promise.resolve() ,然后打印后面的 ’async1 end‘ // *7
12.最后执行定时器(宏任务) setTimeout,打印 ’setTimeout‘ // *8

那么现在,我们是不是大致上对async / await 理解了呢,我们来改一下这道题再来看看,把 async2 改造一下
改造的题目如下:

async function async1(){
    console.log('async1 start')
    await async2()
    console.log('async1 end')
}
function async2(){ // 去掉了 async 关键字
    console.log('async2');
}
console.log('script start')
setTimeout(function(){
    console.log('setTimeout')
},0)  
async1();
new Promise(function(resolve){
    console.log('promise1')
    resolve();
}).then(function(){
    console.log('promise2')
})
console.log('script end')



答案如下:

script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout
异步编程是现代软件开发中非常重要的一部分,而在JavaScript中,async和await是用来处理异步操作的两个关键字。下面是一些关于async和await的面试题1. async和await是什么?它们的作用是什么? - async是用来声明一个函数是异步的,它会返回一个Promise对象。 - await用于等待一个Promise对象的解析结果,并且只能在async函数内部使用。它可以暂停函数的执行,直到Promise对象的状态变为resolved(已解决)。 2. async函数返回什么? - async函数始终返回一个Promise对象。这个Promise对象的结果取决于函数中的return语句。 3. 在什么情况下使用async和await? - 当需要处理异步操作时,可以使用async和await来编写更清晰、更易读的异步代码。 - 通常情况下,我们会将回调函数、Promise链式调用或者Generator函数转换为使用async和await的代码。 4. async函数中可以有多个await吗? - 是的,async函数中可以有多个await语句。每个await语句会暂停函数的执行,直到对应的Promise对象解析为已解决状态。可以按需使用多个await语句来处理多个异步操作。 5. async函数中如何处理错误? - 可以使用try-catch语句块来捕获和处理错误。在使用await等待一个Promise对象时,如果该Promise对象的状态变为rejected(已拒绝),则会抛出一个异常,可以通过try-catch来捕获并处理该异常。 这些面试题可以帮助你了解async和await的基本概念和用法。当然,还有更多的问题可以进一步探讨和学习。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值