位置: IT常识 - 正文

异步函数async(异步函数执行顺序)

编辑:rootadmin
异步函数async 什么是同步异步

推荐整理分享异步函数async(异步函数执行顺序),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:异步函数同步执行,异步函数中需要等数据获取完,wx.navigateTo才跳转,异步函数同步执行,异步函数同步执行,异步函数是什么意思,异步函数有哪些,异步函数的作用,异步函数和同步函数,内容如对您有帮助,希望把文章链接给更多的朋友!

在最新的ES7(ES2017)中提出的前端异步特性:async、await。 在了解async和await之前得先明白什么是同步函数,什么是异步函数。

同步函数:当一个函数是同步执行时,那么当该函数被调用时不会立即返回,直到该函数所要做的事情全都做完了才返回。比如说在银行排队办理业务,要等到前面一个人办完才能到下一个。异步函数:如果一个异步函数被调用时,该函数会立即返回尽管该函数规定的操作任务还没有完成。比如一个人边吃饭,边看手机,边说话,就是异步处理的方式。async

async从字面意思上很好理解,是异步的意思,async用于申明一个function是异步的,函数返回的是一个promise。

async作为关键字放到函数前面,用于表示函数是一个异步函数。该函数的执行不会阻塞后面代码的执行。async函数返回的是一个promise对象,可以调用then方法获取到promise的结果值。async function f() { return 1; } f().then((res) => { console.log(res) }) //1

async函数会返回一个promise对象,如果function中返回的是一个值,async直接会用Promise.resolve()包裹一下返回。

await

await有等待的意思,等待一个异步方法执行完成。

await关键字只能放async函数里面。 而async函数里不是必须有await。await关键字的返回结果就是其后 promise执行的结果值,是resolved或者 rejected后的值。function getSomething() { return "something"; } async function testAsync() { return Promise.resolve("hello async"); } async function test() { const v1 = await getSomething(); const v2 = await testAsync(); console.log(v1, v2); } test(); // something hello async 为什么await关键词只能在async函数中用

await操作符等的是一个返回的结果,那么如果是同步的情况,那就直接返回了。

那如果是异步的情况呢,异步的情况下,await会阻塞整一个流程,直到结果返回之后,才会继续下面的代码。

阻塞代码是一个很可怕的事情,而async函数,会被包在一个promise中,异步去执行。所以await只能在async函数中使用,如果在正常程序中使用,会造成整个程序阻塞,得不偿失。

async/await异步函数async(异步函数执行顺序)

异步代码就像写同步代码一样,也避免了回调地狱。

串行:等待前面一个await执行后接着执行下一个await,以此类推async function asyncAwaitFn(str) { return await new Promise((resolve, reject) => { setTimeout(() => { resolve(str) }, 1000); })}const serialFn = async () => { //串行执行 console.log(await asyncAwaitFn('string 1')); console.log(await asyncAwaitFn('string 2')); console.timeEnd('serialFn ')}serialFn();

并行:将多个promise直接发起请求(先执行async所在函数),然后再进行await操作async function asyncAwaitFn(str) { return await new Promise((resolve, reject) => { setTimeout(() => { resolve(str) }, 1000); })}const parallel = async () => { //并行执行 const parallelOne = asyncAwaitFn('string 1'); const parallelTwo = asyncAwaitFn('string 2') //直接打印 console.log(await parallelOne) console.log(await parallelTwo) console.timeEnd('parallel')}parallel()

async、await错误处理

在Promise中当请求reject的时候我们可以使用catch。为了保持代码的健壮性使用async、await的时候我们使用try catch来处理错误。

async function catchErr() {try {const errRes = await new Promise((resolve, reject) => {setTimeout(() => {reject("http error...");}, 1000););//平常我们也可以在await请求成功后通过判断当前status是不是200来判断请求是否成功// console.log(errRes.status, errRes.statusText); } catch(err) { console.log(err); }}catchErr(); //http error...

虽然async、await也使用到了Promise但是却减少了Promise的then处理使得整个异步请求代码清爽了许多。

前面扯了这么多,也是时候回到正题了,我们先来看下面的一个例子。 我们需要做一个功能,在页面加载的时候实现查询三组数据:查询用户、查询朋友、查询图片。

class Api { constructor () { this.user = { id: 1, name: 'test' } this.friends = [ this.user, this.user, this.user ] this.photo = 'not a real photo' } getUser () { return new Promise((resolve, reject) => { setTimeout(() => resolve(this.user), 200) }) } getFriends (userId) { return new Promise((resolve, reject) => { setTimeout(() => resolve(this.friends.slice()), 200) }) } getPhoto (userId) { return new Promise((resolve, reject) => { setTimeout(() => resolve(this.photo), 200) }) } throwError () { return new Promise((resolve, reject) => { setTimeout(() => reject(new Error('Intentional Error')), 200) }) }}

在上面定义了API的类,里面写了三个封装的查询接口。现在要依次执行那三个操作。 第一种方法:Promises的嵌套:

function callbackHell () { const api = new Api() let user, friends api.getUser().then(function (returnedUser) { user = returnedUser api.getFriends(user.id).then(function (returnedFriends) { friends = returnedFriends api.getPhoto(user.id).then(function (photo) { console.log('callbackHell', { user, friends, photo }) }) }) })}

从上面可以看出,这代码块很简单,但它有很长、很深的嵌套。

这只是简单的函数内容,但在真实的代码库中,每个回调函数可能会很长的代码,这就可能会导致代码变得庞大难读懂。处理此类代码,在回调内的回调中使用回调,通常称为“回调地狱”。

更糟糕的是,没有错误检查,因此任何回调都可能作为未处理的resove/reject而失败。 第二种方法:Promises链:

function promiseChain () { const api = new Api() let user, friends api.getUser() .then((returnedUser) => { user = returnedUser return api.getFriends(user.id) }) .then((returnedFriends) => { friends = returnedFriends return api.getPhoto(user.id) }) .then((photo) => { console.log('promiseChain', { user, friends, photo }) })}

Promises的一个不错的功能是,可以通过在每个回调中返回另一个Promises来链接它们。这样,我们可以将所有回调保持在相同的缩进级别。我们还可以使用箭头函数来简化回调函数的

本文链接地址:https://www.jiuchutong.com/zhishi/298721.html 转载请保留说明!

上一篇:2022前端面经---改变this指向问题(call、apply、bind)(2021年前端面试)

下一篇:【Vue3】如何创建Vue3项目及组合式API(创建vue3项目的步骤)

  • 微信注销后手机号还能注册吗重新申请需要多久

    微信注销后手机号还能注册吗重新申请需要多久

  • 小米手机如何让应用保持运行(小米手机如何让屏幕一直亮着)

    小米手机如何让应用保持运行(小米手机如何让屏幕一直亮着)

  • 红米k40双卡都支持5G网络吗(红米k40双卡都支持电信吗)

    红米k40双卡都支持5G网络吗(红米k40双卡都支持电信吗)

  • 怎样修改微信名字(怎样修改微信名称的备注)

    怎样修改微信名字(怎样修改微信名称的备注)

  • 8p建议更新13.5吗(苹果8p建议升级13.5.1系统吗)

    8p建议更新13.5吗(苹果8p建议升级13.5.1系统吗)

  • 微信二维码过期了怎么才能恢复(微信二维码过期了怎么才能进群)

    微信二维码过期了怎么才能恢复(微信二维码过期了怎么才能进群)

  • 积目距离是实时的吗(积目的距离准吗)

    积目距离是实时的吗(积目的距离准吗)

  • 华为p30看视频总黑屏(华为手机看视频断断续续的如何解决)

    华为p30看视频总黑屏(华为手机看视频断断续续的如何解决)

  • 取消网页导航如何恢复(已取消网页导航弹窗)

    取消网页导航如何恢复(已取消网页导航弹窗)

  • WPS如何做ppt幻灯片(wps怎样做幻灯片,用wps如何做ppt幻灯片?)

    WPS如何做ppt幻灯片(wps怎样做幻灯片,用wps如何做ppt幻灯片?)

  • ipad 型号查询表	(ipad的型号查询)

    ipad 型号查询表 (ipad的型号查询)

  • 原生模式是什么相机(原生模式是什么拍照软件)

    原生模式是什么相机(原生模式是什么拍照软件)

  • miui公测更新频率(miui系统公测频率)

    miui公测更新频率(miui系统公测频率)

  • 为什么抖音有的显示在线有的不显示(为什么抖音有的视频不能保存至相册)

    为什么抖音有的显示在线有的不显示(为什么抖音有的视频不能保存至相册)

  • 短信显示无主题原因(短信显示无主题删不掉)

    短信显示无主题原因(短信显示无主题删不掉)

  • 电脑拨号连接不上怎么办(电脑拨号连接不上怎么办错误629)

    电脑拨号连接不上怎么办(电脑拨号连接不上怎么办错误629)

  • 华为p10连拍设置(华为p10手机连拍怎么设置)

    华为p10连拍设置(华为p10手机连拍怎么设置)

  • 一加7T怎么加密应用(一加7怎么加密应用)

    一加7T怎么加密应用(一加7怎么加密应用)

  • qq音乐怎么下载到桌面(qq音乐怎么下载歌曲)

    qq音乐怎么下载到桌面(qq音乐怎么下载歌曲)

  • 格式按钮在哪里(格式按钮不见了)

    格式按钮在哪里(格式按钮不见了)

  • 笔笔攒解冻钱去哪了(笔笔攒解冻的钱在哪里)

    笔笔攒解冻钱去哪了(笔笔攒解冻的钱在哪里)

  • 栏宽6.8厘米怎么设置(栏宽6.8厘米怎么设计)

    栏宽6.8厘米怎么设置(栏宽6.8厘米怎么设计)

  • 拼多多账号注销流程(拼多多账号注销后订单还在吗)

    拼多多账号注销流程(拼多多账号注销后订单还在吗)

  • 学习通怎么退出课程

    学习通怎么退出课程

  • uniapp引入全局js,vue2/vue3不同方式引入(uniapp引入全局scss)

    uniapp引入全局js,vue2/vue3不同方式引入(uniapp引入全局scss)

  • 莫尼博克湾的芦苇岛,纽约长岛 (© Claudia Uripos/eStock Photo)(莫尼莫克房车)

    莫尼博克湾的芦苇岛,纽约长岛 (© Claudia Uripos/eStock Photo)(莫尼莫克房车)

  • phpcms可以上传网页吗(phpcms怎么用)

    phpcms可以上传网页吗(phpcms怎么用)

  • 符合条件的小型微利企业所得税税率为
  • 核定征收三种方式
  • 以公允价值计量计入其他综合收益
  • 工程行业存货哪些科目组成
  • 技术转让是指
  • 应付利润借方有余额怎么处理
  • 出让土地缴纳的契税怎么账务处理
  • 劳务分包和劳务外包
  • 利润表的利息费用怎么算出来的
  • 应取得未取得发票
  • 旅游开发公司有什么职位
  • 金税三期社保费管理客户端v1.0.088(生产环境)
  • 查补以前年度所得税如何填写申报表
  • 管理费用是负的是什么意思
  • 没办税务登记公示怎么办
  • 公司法人要交什么税
  • 企业员工无偿使用合法吗
  • 应付利息与应付利息区别
  • 企业所得税前列支的费用
  • 3个点的发票有哪些
  • 设备安装费计入设备成本吗
  • 做季报和月报增发的区别
  • 公司预付的货款怎么做账
  • 可转换债券赎回和回售如何理解
  • 王者荣耀中吕布的克星
  • 如何在没有开瓶器的情况下开红酒
  • 用优启通怎么装系统
  • 衍生金融资产属于投资性资产吗
  • 个人所得税如何退税操作步骤
  • 日志文件的名称和位置是什么
  • 对于接受捐赠的资产价值,应计入当期损益
  • 电脑前面板耳机没声音怎么设置bios
  • wordpress经典编辑器用法
  • 赠与房屋再次出售税费
  • form action target
  • PHP:imagecolorstotal()的用法_GD库图像处理函数
  • 新建vue项目
  • 相思树学名叫什么
  • 工业企业计入制造费用的工资还需要交工会经费吗
  • 正在求偶的凤头卡拉鹰,美国德克萨斯州 (© Alan Murphy/Minden Pictures)
  • redis的eval命令
  • 小规模纳税人印花税减半征收政策
  • 织梦如何给栏目增加缩略图
  • 利润表的格式分为哪几种
  • 如何免费下载win10 家庭版
  • wordpress账号密码忘记了
  • python中的thread
  • 高效刷题app
  • 资产处置损益算营业外收入吗
  • 一般纳税人废业企业库存怎么办
  • 个体工商户经营所得税税率表2023年
  • 企业哪些情况下需要报税
  • 个税申报中本人扣除比例什么意思
  • 深圳税务2021
  • 使用distinct在mysql中查询多条不重复记录值的解决办法
  • 残疾人开公司要交税吗
  • 公司没有车加油费怎么报
  • 影响以前年度损益的科目
  • 企业注销预付账款怎么做
  • 固定成本包括哪些项目
  • 在windows操作中
  • win8系统计算机在哪里
  • win10系统如何开启远程桌面连接
  • Unity3D游戏开发标准教程
  • adt Failed to create the Java Virtual Machine.
  • bat批处理命令
  • python black
  • 安装perl模块
  • 冒充咋写
  • cocos2dx运行原理
  • unity自带的代码编辑器
  • jquery插件库怎么导入
  • a标签的href和onclick
  • python如何发送http请求
  • 调试动态加载的js
  • android 打包
  • 国家税务局大厅上班时间
  • 自然人电子税务局web端怎么进入
  • 企业支付的年度报告审计费
  • 深圳市福田区行政代码是多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设