彻底搞懂 async await 的return问题

async 的三大返回类型 序   博主简单数了下自己发布过的异步文章,已经断断续续 8 篇了,这次我想以 async 的返回类型为例,单独谈谈。   异步方法具有三个可让开发人员选择的返回类型:Task、Task 和 void。    什么时候需要使用哪一种返回类型,具体情况需要具体分析。如果使用不当,程序的执行结果也许并不是你想要的,下面我们就来好好谈谈如何针对不同的情况选择不同的返回类型。   阅读详情
AI摘要

本文深入解析async/await机制,揭示其作为Promise语法糖的本质,探讨异步转同步的解决方案,通过实例演示async函数与await关键字的正确使用,及在AJAX请求中的应用场景。

什么是async await?

简单的来说 async await就是promise的语法糖,我们可以把它认知为promise的简写,另外你可以将它简单的认为是异步转同步的那么一个解决方案。

Async?

首先我们来看这一串代码

//立即执行函数,不了解的话可以去查一下资料
const a = (async () => {
  return 111
})()
console.log(a) // Promise { 111 }

我们可以看到给函数添加上async之后 返回值即成为了promise对象,正如async译文一样,异步,也就是说我们把这个函数变成了异步promise函数。此时我们再去return 一个值的话,并不会是我们想的那个结果。
当然如果单纯的添加一个async并不是这个函数就成为异步了,不要那么去想,那么去想你就错了

console.log('first') //1
  ; (async () => {
    console.log('tow') //2
  })()
console.log('last') //3

如上所示,async函数并没有像异步计时器settimeout一样,挂起,当last执行完成之后再去执行,而是直接输出了,所以我们不要理所当然的去想加上了 async,这个函数就成异步函数了。
当然如果我们不return的话,就是返回一个空的promise对象,其实如果不做啥特殊操作的话,async自己单独使用的话,其实不是特别能显示出它的作用。

Await?

这个时侯我们就应该想到 await了,await是什么?如果promise对象通过then或catch方法又注册了回调函数,async函数执行完以后,注册的回调函数就会放到异步队列中,等待执行。如果只是async, 和promise 差不多,但有了await就不一样了, await 关键字只能放到async 函数里面,await是等待的意思,那么它等待什么呢,它后面跟着什么呢?其实它后面可以放任何表达式,不过我们更多的是放一个返回promise 对象的表达式,它等待的是promise 对象的执行完毕,并返回结果,我们先来尝试这放一个异步fs读取

console.log('first') //
  ; (async () => {
    // 异步读取
    const fs111 = await fs.readFile('云开发.txt', function (err, data) {
      if (err) {
        return console.error(err)
      }
      return data.toString()
    })
    console.log(fs111)
  })()
console.log('last') //

在这里插入图片描述
我们的结果是返回的undefined。那是为什么呢?正如我们上方所说,await等待的是一个promise对象,那么我们的fs是promise对象么,显然并不是,所以await并没有阻塞后方代码执行,因为被挂起了确切地说fs并没有执行完,还没有返回数据data还是空的,所以结果就是空。
解决的办法也很简单,将fs封装成一个promise就可以了,再去执行,console.log()输出就会显示,读取的文件数据。

那么好,简单的介绍完async和await之后,我们其实应该知道最常用的场景是在哪里,其实就是发送ajax请求

这里的请求是 axios 获取数据,然后存入到vue的data中

    async leftMenu() {
      const { data: res } = await this.$http.get('menus')
      this.menuList = res.data
    }

因为axios本身返回的就是一个promise对象,await接受的就是成功之后的回调函数数据,在获取到数据之后,我们将其赋值给data中的menuList,这样扎眼一看其实没什么问题,但是我们换种思路 因为本身 async是一个函数那么我们可不可以将获取到的值return出去,然后再从像created中,mounted中直接用this.menuList = leftMenu()呢?

我们可以来模拟尝试一下

const res = async function (a) {
  let xiao = await new Promise((resolve, reject) => {
    setTimeout(() => {
      if (a === 0) {
        resolve('你成功获取了数据')
      } else {
        reject('获取数据失败了')
      }
    }, 3000)
  })
  // console.log(xiao)
  return xiao
}

const xiaores = res(0)
console.log(xiaores)

在这里插入图片描述
结果发现返回的数据是promise,并不是我们想的返回一个你成功获取了数据,这是为什么呢?因为你这个时候要清楚await是promise的语法糖呀!就相当于.then呀,那么then的话,是不是就是异步代码了?这跟settimeout没关系,要知道.then也会被挂起,那么await就不会被挂起了么?我们知道他是一个异步函数之后,执行的是promise,那么他就会去执行,下方的同步代码,这也就导致了,数据其实还没有返还回来,导致无法将异步返回的数据赋值给我们我们想赋予的哪一个值。

解决它也很简单

const res = async function (a) {
  let xiao = await new Promise((resolve, reject) => {
    // setTimeout(() => {
    if (a === 0) {
      resolve('你成功获取了数据')
    } else {
      reject('获取数据失败了')
    }
    // }, 3000)
  })
  // console.log(xiao)
  return xiao
}
  ; (async function (a) {
    const xiaores = await res(0)
    console.log(xiaores)
  })()

在这里插入图片描述
其实你就可以简单的理解就是调用了他的then方法

const res = async function (a) {
  let xiao = await new Promise((resolve, reject) => {
    // setTimeout(() => {
    if (a === 0) {
      resolve('你成功获取了数据')
    } else {
      reject('获取数据失败了')
    }
    // }, 3000)
  })
  // console.log(xiao)
  return xiao
}
res(0).then(res => {
  const xiaores = res
  console.log(xiaores)
})

得到的结果是一样的
总结,其实async await可以return,但是要经历多次嵌套,所以说能别return就别return了。
再给大家放一下今天下午遇到的错误

在这里插入图片描述
这其实也是向我们刚才那样,return 一个值,让那后用变量接收,但是返回的值确是空?
因为什么?因为return放在了forEach里,return放在forEach里是没有用的,我们的函数其实并没有返回值,所以结果是空。这个bug,差点整的我怀疑让人生,让我又一次的怀疑,我对async以及await的认知。
所以说写代码还是要认真,加油吧小伙伴么!

提及一下,如果我们想要去遍历中停止请使用 for循环或者 for in for of,甚至 some,every,fliter,map,这些都是可以的,如需了解请关注后续文章

await VS return VS return await 在JavaScript中,当一个函数被async修饰后,它会返回一个Promise对象。如果 return 后面跟着一个值,那么这个值会被包装在一个resolved状态的Promise对象中返回。如果 return 后面跟着一个Promise对象,那么这个Promise对象会被直接返回。如果 return 后面没有值,或者没有 return 语句,函数会隐式返回一个resolved状态的Promise对象,其值为 undefined。 阅读详情

相关推荐

async/await中return与return await的区别:Promise返回与异常处理深度解析

异步编程是现代前端开发的基石,而Promise作为异步操作的核心对象,其状态与值传递机制直接影响代码的可靠性。async/await语法糖让异步代码看起来像同步代码,但return语句在async函数中的行为却暗藏玄机。理解async函数始终返回Promise、return的值会被Promise.resolve包装、以及return await在try-catch中的异常捕获差异,是避免线上bug的关键。在接口请求、错误恢复、并发任务等实际场景中,return与return await的选择不仅影响执行时机

weixin_34224941的博客 371

async里面的return的理解

结论:async函数return的是一个promise对象,也就是说,会将你想返回的数据,包裹在一个promise的resolve里面* 想在fun3里面取得fun1里面的resolve数据,下面的写法是错误的 //原本这样写(这样写是错误的) function fun1() { return new Promise((resolve,reject) => { resolve('fun1') }) } async function fun2() { const fun1Data

zz18256889177的博客 6828

彻底理解Async/Await 原理分析

 一.Async, Await机制总结 async/await是写异步代码的新方式,以前的方法有回调函数和Promise。 async/await是基于Promise实现的,它不能用于普通的回调函数。 async/await与Promise一样,是非阻塞的。 async/await使得异步代码看起来像同步代码,这正是它的魔力所在。  二.Async, Await机制和promise对...

一点码客 2866

async await返回值说明

javascript中promise 使用async和await注意事项

laoli815的博客 9274

Calibre license失效的解决方法

Calibre license失效的解决方法

qq_45354630的博客 6481

单卡调试OpenGait:从分布式到本地的轻量级改造指南

本文为个人开发者和研究者提供了一份详细的OpenGait框架单卡调试指南。针对该框架默认依赖多GPU分布式训练的问题,文章通过分析核心痛点,逐步讲解了如何从环境搭建、绕过分布式初始化陷阱、处理通信后端报错到最终配置与调试,实现从分布式到本地的轻量级改造,帮助读者在单张GPU上高效进行步态识别模型的验证与学习。

weixin_28223453的博客 138

这次彻底搞懂async&await

1.async 函数返回一个promise对象,可以使用then方法添加回调函 async function show() { return {a:23,b:34} } console.log(show()) // //Promise {<fulfilled>: {…}} show().then(res=>{ console.log('res',res) // res {a: 23, b: 34} }) 2.await 关键字存在async函数表达式中,用于等待Pro

车联网开发的博客 385

2025数学建模国赛A题1-4问详解(论文+完整代码)

本文介绍了数学建模国赛A题的解题思路,重点分析了三维遮蔽模型的建立和运动学代码实现。相比第一题,第二题增加了未知参数求解,需要采用遗传算法等非线性优化方法。文章强调该模型由专业团队原创开发,代码可运行,并提醒参赛者警惕市场上的保奖班现象。整体内容聚焦于竞赛解题技巧和原创性保证。

Eloveeeee的博客 2799

async/await最详细的讲解

async/await最详细的讲解

1万+

【Flink】状态编程: 订单超时告警

文章目录一、基础概念二、Flink状态编程1、支持的状态类型2、Managed Keyed State六种类型基本API状态的生命周期3、Managed Operator State三、案例:订单延迟告警统计1、需求描述2、需求分析3、数据与模型4、详细实现 一、基础概念 在Flink架构体系中,有状态计算可以说是Flink非常重要的特性之一。 有状态计算是指: 在程序计算过程中,在Flink...

一只皮皮熊 2862

ORB-SLAM3的Euroc数据集测试

(一)测试运行 不同模式测试过程(以MH_03为例) 1、pure mono 运行SLAM: cd ORB-SLAM3/Example #run slam ./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml "$pathDatasetEuroc"/MH03 ./Monocular/EuRoC_TimeStamps/MH03.txt dataset-MH03_mono 利用ORB-SLAM3自带..

ljtx200888的博客 9146

C# 彻底搞懂async/await

关键: 异步方法:在执行完成前立即返回调用方法,在调用方法继续执行的过程中完成任务。 async/await 结构可分成三部分: (1)调用方法:该方法调用异步方法,然后在异步方法执行其任务的时候继续执行; (2)异步方法:该方法异步执行工作,然后立刻返回到调用方法; (3)await 表达式:用于异步方法内部,指出需要异步执行的任务。一个异步方法可以包含多个 await 表达式(不存在 await 表达式的话 IDE 会发出警告)。 一、What's 异步? ...

lxrj2008的专栏 1万+

游戏大厂技术护城河——为什么你抄不了原神?

│ │ │ │ ↓ 通过 │ │ │ │。│ │ │ │ ↓ 成功 │ │ │ │。│ │ │ │ ↓ 完成 │ │ │ │。│ │ │ │ ↓ 达标 │ │ │ │。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 71

async 和 await(详解)

一、async 和 await promise 使用 .then 链式调用,但也是基于回调函数 async/await 更加优雅的异步编程的写法 1.它是消灭异步回调的终极武器 2.它是同步语法,也就是用同步的写法写异步的代码 案例1:promise异步加载图片 分别使用 .then 和 await 来获取结果 区别 1.await 完全没有回调函数 2.await 是同步写法,异步操作 3.await 后面不仅仅可以接 promise对象,还可以接 async 函数 //里面函数为AJAX,因此是

前端知识库 2万+

单片机原理及应用知识点汇总(一)

在键闭合稳定时,读取键的状态,并且必须判别;、串行通信的优点是只需一对传送线,成本低,适于远距离通信,缺点是传送速度较低。、并行通信的优点是传送速度高,缺点是所需传送线较多,远距离通信不方便。、串行通信中,为使设备同步工作,需要通信双方有两个共同的要求,一是。系列单片机的指令中,既有带借位的减法指令,又有不带借位的减法指令。、简述在使用普通按键的时候,为什么要进行去抖动处理,如何处理。、在异步通信的帧格式中,数据位是低位在前高位在后的排列方式。、异步通信中,波特率是指每秒传送二进制代码的位数,单位是。

T19900的博客 696

从 Token 到 Agent:一文串起 AI 大模型核心概念

摘要:本文系统解析了现代AI系统的八大核心概念:Token(语言处理的最小单位)、Context(AI的短期记忆)、Prompt(指令接口)、Tool(能力扩展器)、MCP(工具生态协议)、Agent(自主智能体)和AgentSkill(专业技能封装)。文章揭示了这些概念如何共同构成AI从基础语言理解到自主决策的技术脉络,重点阐述了Token对计算成本的影响、Prompt工程的重要性、Tool如何突破AI的能力边界,以及Agent如何通过"感知-规划-执行-反思"循环完成复杂任务。最后指

jundao1997的专栏 249

一盏茶的功夫帮你彻底搞懂JavaScript异步编程从回调地狱到async/await

最后,我们创建了一个 asyncToGenerator 函数,该函数接受一个 Generator 函数作为参数,并返回一个新的 Promise,这个 Promise 的解析值就是 Generator 函数的返回值。我们知道 Generator 可以在 yield 关键字处暂停和恢复执行,Promise 可以处理异步操作,两者结合在一起,就可以实现一个类似于 async/await 的功能。在async函数内部,我们可以使用await关键字来暂停函数的执行,等待一个异步操作的完成,并获得其结果。

欢迎来到我的前端博客!这里汇集了关于前端开发的最新技术、实用工具和经验分享。我将为你提供详细的教程、代码示例和实战案例,帮助你掌握Web开发的核心概念和技能。不论你是初学者还是有经验的开发者,这个博客都适合你。 5153

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

async和 await 的基本使用

async/await是一种用于处理异步操作的Promise语法糖。语法糖:更易读、更简洁或更符合人类思维习惯而设计的一种语法方式)通过使用async关键字声明一个函数为异步函数(返回值是Promise类型)使用await关键字等待Promise的解析(完成或拒绝),以同步的方式编写异步操作的代码。

m0_75219675的博客 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【转】C# 彻底搞懂async/await

关键: 异步方法:在执行完成前立即返回调用方法,在调用方法继续执行的过程中完成任务。 async/await 结构可分成三部分: (1)调用方法:该方法调用异步方法,然后在异步方法执行其任务的时候继续执行; (2)异步方法:该方法异步执行工作,然后立刻返回到调用方法; (3)await 表达式:用于异步方法内部,指出需要异步执行的任务。一个异步方法可以包含多个 await 表达式(不存在 await 表达式的话 IDE 会发出警告)。 一、What's 异步? ...

sinolover的专栏 1978

什么是async/await?什么时候用async/await?——用生活中的例子彻底搞懂

​同步:你站在柜台前,​死死盯着厨师煎汉堡,直到汉堡做好才能点饮料。这期间队伍后面的人只能干等(就像浏览器卡死)。​异步:你点完汉堡后拿到一个取餐号,转身去选座位、玩手机、拿饮料,​听到叫号再回来取餐​(这就是异步非阻塞)。就是帮你优雅管理取餐号的工具!​消灭回调地狱:代码从“金字塔形”变“扁平化”。​错误处理更直观:用try/catch替代。​符合人类直觉:像写同步代码一样思考异步流程。终极类比就像给你的代码配了一个私人助理。

lynm123的博客 943

手写 async/await:彻底搞懂它的实现原理与本质

本质是 generator 的语法糖;如何用 generator + 执行器手写 async 函数行为;async 函数的返回值其实就是一个 Promise;Babel 编译 async/await 的实际实现原理;为什么 async/await 能提升可读性但仍依赖于 Promise。

Anthony1453的博客 993

async/await return机制完全指南:从Promise包装到最佳实践

异步编程是现代JavaScript开发的基石,而Promise作为异步操作的核心抽象,其状态流转与错误处理直接决定了代码的健壮性。在async/await语法中,return语句的行为与普通函数截然不同:返回值会被隐式包装成Promise,直接return与return await在try/catch场景下会产生天差地别的结果。理解这些底层规则,能帮助开发者避免Promise rejection被静默吞掉、嵌套函数忘写return导致数据丢失等经典问题。从Error对象的意外返回,到forEach回调中无效

weixin_34198762的博客 303

C#异步编程之async、await

在C#编程种经常听过异步编程,本文就来以一个实际案例来讲解异步编程中async、await的用法。我们要实现也给需求,点击界面按钮后,五秒后界面的Lable控件的值被赋值为“123”,下面分别介绍4种方法。

qq_34059233的博客 1199

Python 中的 async 和 await 入门

Python中的async/await用于编写异步代码,使程序能同时处理多个任务。同步代码会阻塞程序执行,而异步代码能在等待I/O操作时执行其他任务,提高效率。通过async定义协程函数,用await等待异步任务完成,配合asyncio.run()运行主函数和asyncio.gather()并发执行多个任务。异步编程适用于网络请求等I/O密集型场景,但不适合CPU密集型计算。常见框架如FastAPI利用异步处理高并发请求。注意直接调用async函数只会返回协程对象,需通过await或事件循环驱动执行。

尽日寻春不见春,芒鞋踏遍陇头云。归来笑拈梅花嗅,春在枝头已十分。 1214
上一篇: 小程序 云开发的基本操作
下一篇: 小程序云开发疯狂踩坑之没值怎么办?
归来巨星
归来巨星 新星创作者: 前端开发技术领域 新星创作者: 前端开发技术领域
博客等级 码龄7年 5391粉丝 95原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

归来巨星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值