位置: IT常识 - 正文

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

发布时间:2024-01-17
异步函数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项目的步骤)

  • 荣耀手机录音在哪里找(荣耀手机录音在哪里开)

    荣耀手机录音在哪里找(荣耀手机录音在哪里开)

  • 微信同步后聊天记录会同步吗?(微信同步聊天记录到电脑可以查到吗)

    微信同步后聊天记录会同步吗?(微信同步聊天记录到电脑可以查到吗)

  • 苹果11怎么关闭延时3秒(苹果11怎么关闭自动调节亮度)

    苹果11怎么关闭延时3秒(苹果11怎么关闭自动调节亮度)

  • 关闭共享相簿(关闭共享相簿会删除隔空投送的照片吗)

    关闭共享相簿(关闭共享相簿会删除隔空投送的照片吗)

  • 快手退款关闭怎么重新申请(快手退款关闭怎么打开)

    快手退款关闭怎么重新申请(快手退款关闭怎么打开)

  • 对up主稿件的一键三连长按什么键(对up主稿件的一连三操作)

    对up主稿件的一键三连长按什么键(对up主稿件的一连三操作)

  • 摄像头不聚焦怎么回事(摄像头不聚焦模糊是什么原因?)

    摄像头不聚焦怎么回事(摄像头不聚焦模糊是什么原因?)

  • cam al00是什么手机(cam-al00是华为什么型号)

    cam al00是什么手机(cam-al00是华为什么型号)

  • qq空间部分人可见会有通知吗(qq空间部分人可见别人能看到可见人吗)

    qq空间部分人可见会有通知吗(qq空间部分人可见别人能看到可见人吗)

  • 橙v和黄v有什么区别(橙v和黄v有什么关系)

    橙v和黄v有什么区别(橙v和黄v有什么关系)

  • wps做的ppt用office打不开(wps做的ppt用office 音乐放不出来)

    wps做的ppt用office打不开(wps做的ppt用office 音乐放不出来)

  • iphone深色模式怎么设置(iphone深色模式怎么添加到快捷)

    iphone深色模式怎么设置(iphone深色模式怎么添加到快捷)

  • pdf是什么意思(pdf是什么意思手机怎么打开)

    pdf是什么意思(pdf是什么意思手机怎么打开)

  • 腾讯课堂能听到学员声音吗(腾讯课堂听得见学生的声音吗)

    腾讯课堂能听到学员声音吗(腾讯课堂听得见学生的声音吗)

  • 全民k歌扫一扫功能在哪里(全民k歌扫一扫在哪个位置)

    全民k歌扫一扫功能在哪里(全民k歌扫一扫在哪个位置)

  • 一个奇异果会员可以同时几个电视登录(一个奇异果会员可以几个人用)

    一个奇异果会员可以同时几个电视登录(一个奇异果会员可以几个人用)

  • ps怎么让图片动起来(ps怎么让图片动作不一样)

    ps怎么让图片动起来(ps怎么让图片动作不一样)

  • 抖音怎么关闭我的橱窗(抖音怎么关闭我喜欢的作品不给别人看到)

    抖音怎么关闭我的橱窗(抖音怎么关闭我喜欢的作品不给别人看到)

  • 小米8青春版有息屏显示吗(小米8青春版有OTG功能吗)

    小米8青春版有息屏显示吗(小米8青春版有OTG功能吗)

  • ps怎么把空白填充(ps怎么把空白填充成颜色)

    ps怎么把空白填充(ps怎么把空白填充成颜色)

  • 小米手机怎么局部截图(小米手机怎么局部录屏)

    小米手机怎么局部截图(小米手机怎么局部录屏)

  • qq怎么取消佩戴头衔(手机qq怎么取消佩戴头衔)

    qq怎么取消佩戴头衔(手机qq怎么取消佩戴头衔)

  • 抖音镜像两个人怎么拍(抖音镜像功能在哪里)

    抖音镜像两个人怎么拍(抖音镜像功能在哪里)

  • ppt2016暗香扑面找不到(ppt2016暗香扑面主题)

    ppt2016暗香扑面找不到(ppt2016暗香扑面主题)

  • 华为p20怎么升级9.1(华为p20怎么升级不了鸿蒙系统)

    华为p20怎么升级9.1(华为p20怎么升级不了鸿蒙系统)

  • 小米运动行为标注有什么用(小米运动行为标注)

    小米运动行为标注有什么用(小米运动行为标注)

  • 如何找到您会获得免费的Windows 11升级?(如何找到您会获得的权限)

    如何找到您会获得免费的Windows 11升级?(如何找到您会获得的权限)

  • python gensim库是什么?(pythongui库)

    python gensim库是什么?(pythongui库)

  • 企业准备注销了怎么恢复
  • 纸质发票红冲操作流程
  • 生产领用周转材料
  • 劳务成本算营业成本吗
  • 现金流量科目怎么选择
  • 购买车位需要交哪些税
  • 建筑业确认主营业务收入
  • 股东退股可以支付现金吗
  • 个人开利息发票的税率与会计分录
  • 残料的会计分录
  • 员工入职第一个月交社保吗
  • 阿里云增值税专用发票
  • 公司前三季度实现营业收入59.17亿元
  • 股权激励取消怎么处理?
  • 利息保障倍数能反映企业偿债能力吗
  • windows中的网络协议的配置原理
  • 华为鸿蒙系统网速慢怎么解决
  • 企业收到财政资金
  • 内部控制的类型有哪些
  • 投入资本回报率是总资产报酬率吗
  • 支付水费现金流量
  • 个税是负数直接工资加上吗
  • 商业保险费包括哪些
  • 筹建期固定资产汇算清缴
  • 什么是票据权利?票据权利的内容有哪些
  • 对数据文件操作,进行数据记录的交换都要经过
  • 苹果手机微信怎么迁移聊天记录到新手机
  • 投资性房地产减值准备属于什么科目
  • 固定资产清理是三栏式还是多栏式
  • 营业利润是怎么计算的?
  • 深度linux使用入门教程
  • 银行票据贴现业务发展中遇到的困难
  • 非货币性资产交换的记忆口诀
  • chrome使用教程
  • 收到采购专用发票
  • PHP jQuery+Ajax结合写批量删除功能
  • 命令行系统
  • 修改命令的快捷键
  • php无限级分销
  • uni app ios
  • 税费的审计
  • 金蝶kis资产负债表中预付款项年初余额公式怎么设置?
  • mongodb用户权限
  • 固定资产年限折旧方法
  • 开发票明目
  • 无形资产加计扣除怎么算举例
  • 企业的经营业务
  • 长期股权投资的账务处理
  • 期末需要结账的账户
  • 残保金的税收优惠政策
  • 一家新成立的贸易企业
  • 快递公司结算员能学到财务知识吗
  • 外贸采购的职责
  • 主营业务收入是含税还是不含税
  • 一次性付款的优势
  • 获取数据库最新的一条记录
  • linux rpm包怎么安装
  • win7怎么装win8系统
  • ubuntu无法进入系统出现uid121
  • 怎么检测u盘是否扩容
  • 如何做电脑系统备份
  • os x 10.11 el capitan系统安装图文教程
  • 在Linux操作系统中哪些命令可以正确关闭系统防火墙
  • mstore.exe - mstore是什么进程 有什么用
  • 微软推送win11
  • win8开机进不了桌面
  • windows8应用商店在哪
  • win7如何设置桌面背景图
  • win8系统打不开exe
  • 原生javascript开发
  • python输出unicode编码
  • python进行aes解密
  • 安卓手机管家怎么关闭
  • jQuery获取checkbox选中的值
  • ubuntu修改默认桌面环境
  • 如何在脚本中调字体
  • javascript教程完整版
  • python中__init__
  • 求资金占用利息的公式
  • 专利转让个人所得税率
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号