js中async和await 的详细讲解

async 函数永远会返回一个promise,即使你在函数中没有返回任何值。

async 函数永远会返回一个promise,即使你在函数中没有返回任何值。

因为:返回没有返回值时函数默认返回的是 undefined.

所以:会返回一个 promise,这个 promise 的 值为 undefined。

javascript 复制代码
async function doThingFn(){
  console.log('doThingFn')
}

// async 函数永远会返回一个promise,即使你在函数中没有返回任何值。
console.log(111, doThingFn())

// 输出的值是 undefined
// 因为async 函数会返回一个promise, 所以我们是可以写then的。
doThingFn().then(res=>{
  console.log('输出的值是',res)
})

async 函数的返回是Promise.resolve

javascript 复制代码
async function doThingFn(){
  console.log('doThingFn')
}

等于与下面的

javascript 复制代码
async function doThingFn(){
  // 返回没有返回值时函数默认返回的是 undefined.
  return Promise.resolve(undefined)
}

当 await 遇到一个被拒绝的 Promise 时,它会抛出异常。因此需要被捕获

下面依次输出的结果是:A

javascript 复制代码
async function doThingFn(){
  console.log('A')
  const result2 = await Promise.reject('B')
  console.log('C')
  return Promise.reject('D' )
}
doThingFn()

为啥只会输出:A ?

因为当 await 遇到一个被拒绝的 Promise 时,它会抛出异常。我们没有捕获,直接就会报错的。

因此下面的 C 不会输出。

为啥不会输出 C

javascript 复制代码
async function doThingFn(){
  try{
    console.log('A')
    const result2 = await Promise.reject('B')
    console.log('C')
  }catch(err){
    console.log('err',err)
  }
}
doThingFn()

分析:当 await 遇到被拒绝的 Promise 时(就是说:Promise.reject):

立即抛出异常,中断当前代码块的执行。

(如果有catch), 直接跳转到最近的 catch 块

await 之后的代码不会执行,因此不会输出 C。

如何让他输出C

javascript 复制代码
async function doThingFn(){
  try{
    console.log('A')
    // 我们在这里将它捕获掉。这样就可以输出C
    const result2 = await Promise.reject('B').catch(err=>{
      console.log('err',err)
    })
    console.log('C')
  }catch(err){
    console.log('err',err)
  }
}
doThingFn()

如何正确获取到B的值

javascript 复制代码
async function timeOutFn(){
  setTimeout(()=>{
    Promise.resolve('B')
  },5000)
}
async function doThingFn(){
  console.log('A')
  // 如何让这里正确获取到B的值
  const result2 = await timeOutFn()
  console.log(result2)
}
doThingFn()

这样就可以获取到值啦~~~

javascript 复制代码
async function timeOutFn(){
  return new Promise((resolve,reject)=>{
    setTimeout(()=>{
      resolve('B')
    },5000)
  })
}

async function doThingFn(){
  console.log('A')
  // return new Promise(...) 是 timeOutFn 函数的返回值
  const result2 = await timeOutFn()
  console.log(result2)
}
doThingFn()

有的小伙伴会问: resolve('B') 为啥不需要return

因为: resolve 是一个回调函数,它用来改变 Promise 的状态从 "pending" 到 "fulfilled"

调用 resolve('B') 只是通知 Promise 完成,并传递值 'B' 给后续的 .then() 或 await

return new Promise(...) 是 timeOutFn 函数的返回值

resolve('B') 是设置 Promise 的解析值,不是函数的返回值

await 不能单独使用,需要配合async一起使用。

不要乱用await,因为 await 是基于 Promise 一起使用的(后面跟的是一个 Promise 对象)

async 和 await 的语法规则

javascript 复制代码
1, async 是 function 的一个前缀,只有 async 函数中才能使用 await 语法  
2, async 函数永远会返回一个promise,即使你在函数中没有返回任何值。  
3, await 后面跟的是一个 Promise 对象,如果不是,则会包裹一层 Promise.resolve()  

await和async的主要作用

await和async 主要是用来优化处理回调地狱的。

相关推荐
木斯佳1 天前
前端八股文面经大全:26届秋招滴滴校招前端一面面经-事件循环题解析
前端·状态模式
光影少年1 天前
react状态管理都有哪些及优缺点和应用场景
前端·react.js·前端框架
晚烛1 天前
CANN + 物理信息神经网络(PINNs):求解偏微分方程的新范式
javascript·人工智能·flutter·html·零售
saber_andlibert1 天前
TCMalloc底层实现
java·前端·网络
逍遥德1 天前
如何学编程之01.理论篇.如何通过阅读代码来提高自己的编程能力?
前端·后端·程序人生·重构·软件构建·代码规范
冻感糕人~1 天前
【珍藏必备】ReAct框架实战指南:从零开始构建AI智能体,让大模型学会思考与行动
java·前端·人工智能·react.js·大模型·就业·大模型学习
程序员agions1 天前
2026年,“配置工程师“终于死绝了
前端·程序人生
alice--小文子1 天前
cursor-mcp工具使用
java·服务器·前端
晚霞的不甘1 天前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
小迷糊的学习记录1 天前
0.1 + 0.2 不等于 0.3
前端·javascript·面试