简谈对ES7的async和await的理解

Javascript.9——ES6【Promise的async和await 使用】 好至此呢,咱们promise这一块东西就学完了啊,promise这个东西呢大家也体验到了,它并没有消除回调的,它回调是没有消除的,你看我们promise里边,【new Promise(…).then( ()=>{ } 】这里边是不是有回调,然后后边我们的then方法里边是不是一个回调函数对吧,Promise它其实没有消除回调,但它消除了什么呢,它有两个作用, 阅读详情

如果遇到过深度回调的朋友一定对JS的回调地狱再熟悉不过了,举个例子说(如果我的列子不恰当尽请谅解),常见的就是省市区级联吧,假如我要获取一个县级市的信息,那么我首先得获得它所在的省的信息,当取得省的信息以后,再拉去地级市的信息,当获得地级市的信息以后,然后才有可能获取到它的信息。这就是典型的深度回调的业务场景。这使得开发人员变得痛苦不堪,代码的质量难以得到保证。

对此,ES6中引入了一个Promise对象来解决此类问题(本文只做大概的讲解),Promise,中文是诺言的意思,表示一段时间(pending)之后一定会获得的结果(resolved状态或者说是fullfilled状态),当然有可能获得的结果是错误的(rejected)。语法是:

function asyncReadFile() {
            return new Promise((resolve, reject) => {
                var counter = 0;
                var timer = setInterval(() => {
                    counter++;
                    console.log({
                        counter
                    })
                    if (counter >= 3) {
                        clearInterval(timer);
                        resolve('hello world');
                    }
                }, 1000)
            })
        }

然后我们通过asyncReadFile().then(result => {  console.log(result) }) 打印出hello world!。

对于之前的省市县级联的业务,我们可以利用Promise改写成:

 getProvinces().then(result => {
            console.log('省级行政区域的信息为:' + result)
            return getCities()
        }).then(result => {
            console.log('地级行政区域的信息为:' + result)
            return getAreas()
        }).then(result => {
            console.log('县级行政区域的信息为:' + result)
        })

假设getProvince、getCities、getAreas都返回一个Promise对象,本来深度回调的代码,就变成了串行的代码。(请大家避免如下书写有关Promise的代码)

 getProvinces().then(result => {
            console.log('省级行政区域的信息为:' + result)
            getCities().then(result => {
                console.log('地级行政区域的信息为:' + result)
                getAreas().then(result => {
                    console.log('县级行政区域的信息为:' + result)
                })
            })
        })

虽然Promise解决了深度回调的问题,但是却引入了大量无用的代码,你会写很多then,代码也变得很难看了。

于是,ES7中加入了async和await这对关键字。

await 命令只能用在async函数之中。async函数是基于Generator函数的实现,由于我们直接跳过了generator,这儿必须得提一个概念叫做协程,才便于大家对async函数的理解。就是函数在执行的时候,如果遇到一些条件,它会将执行条件交给另外的函数,等另外的函数执行完成之后,再将执行权力交回继续执行。(纯属个人理解,如果纰漏,尽情指出)。

画个图就是如下:


async function asyncGetFileInfo() {   var fileInfo await getFileInfo();  return fileInfo; }

这段代码的意思正如上图所示。async函数返回的是一个Promise,我们这样来理解吧,里面既然是异步的东西,肯定有些东西要等一会儿才可以得到吧。而await(await紧跟一个Promise)直接是取得异步的结果,我们可以不用再调用then。

然后 刚才那么多Promise组成的获得行政区域的信息的方法可以简化成如下代码:

async function getDistrictInfo() {
            var province = await getProvinces();
            var city = await getCities();
            var area = await getAreas();
            return `${province}省(市,自治区)${city}市(区)${area}县市区旗`
        }

getDistrictInfo().then(result => {  console.log(result); });

由于ES7太新,浏览器支持的不太好(nodejs请放心使用),我们需要babel进行转码。

npm install --save-dev babel-preset-latest

【知识点】谈谈前端开发中的同步和异步,promise、async/await,应用场景,以及在事件循环机制中的区别 async/await 是基于 Promise 的异步编程解决方案,它通过 async 函数将函数的执行结果封装成 Promise 对象,从而让函数的返回值变为 Promise 对象,方便使用 Promise 对象的 then 方法注册回调函数。异步模式的优点是可以提高程序的性能和响应速度,因为在等待某些操作完成的同时,程序可以执行其他操作。Promise 的回调函数执行时机受 Promise 状态变化的影响,async/await 利用 Promise 对象的状态变化来实现暂停和恢复异步操作的执行。 阅读详情

相关推荐

手把手教你用OPA运放和MOS管搭建恒流源电路(附完整电路图)

本文详细介绍了如何使用OPA运放和MOS管搭建高精度恒流源电路,涵盖核心元器件选型、电路设计、工作原理及实际搭建步骤。通过负反馈控制机制和MOS管工作区设置技巧,实现稳定的电流输出,适用于LED驱动、电池充电等场景。附完整电路图和调试技巧,助您快速掌握恒流源设计。

weixin_29239279的博客 538

ES7之async,await

ES7之async,await 一、基本用法 async,await函数是ES7中引入的语法。与Generator,Promise有很大的关系。 async 使用async修饰的函数,会返回一个Promise对象。 async function func() { return 'a'; } let res = func(); console.log(res); //Promise { 'a' } res.then((value)=>{ console.log(value);

Agumr的博客 554

c++界面开发入门

c++界面开发 DialogBox MessageBox

jiaodou2的博客 6519

ES7 async/await

ES7引入的async/await在JavaScript异步编程中是一个很好的改进,它提供了使用同步样式的代码异步访问resources资源的方式,而且不会阻塞线程。 async/await用于编写JavaScript异步程序 async/await代码书写方式和同步编程相似,代码简洁易读。 async/await基于Promise async/await中可使用try-catc...

JunChow 420

IPC-7351标准实战:如何用LPWizard_10快速生成PCB封装库(附避坑指南)

本文提供了一份详细的IPC-7351标准实战指南,手把手教你使用LPWizard_10软件快速生成符合行业标准的PCB封装库,并直接导入Cadence Allegro。文章深入解读了IPC-7351密度等级的选择逻辑,并重点分享了软件配置、QFN封装生成实战步骤,以及导出失败、焊盘异常等常见问题的避坑解决方案,旨在帮助硬件工程师提升设计效率和可靠性。

weixin_29207439的博客 156

【计算摄影】相机成像原理:从光到JPEG图像

本文我们将从最基本的相机成像原理开始论述,再讨论光线进入相机后,经过一系列处理成为JPEG图像的大致流程。

qq_35149975的博客 2万+

es7中的async、await使用方法示例详解

ES7,也称为 ECMAScript 7,是 ECMAScript 语言规范的第七个主要版本。它于 2016 年 6 月正式发布,包括许多新功能和对该语言的改进。ES7 的一些最显着的特性包括添加了方法,它允许轻松检查数组是否包含特定元素,以及,它允许更简洁和可读的求幂表达式。此外,ES7 引入了几个新的函数和方法来改进数组、字符串和数字的功能。async、await 是es7里面的新语法,它的作用就是 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。

qq_38334677的博客 4157

告别ArcGIS小红叉:从‘无法验证登录信息’到成功连接在线资源的完整排错记录

本文详细记录了从Windows便签的网络错误到ArcGIS连接问题的完整排错过程。通过分析代理服务器、DNS配置和系统网络设置,解决了ArcGIS无法验证登录信息的问题,提供了实用的网络优化方案和技术排错思路。

weixin_26800111的博客 391

js setTimeout、setInterval、promise、async await执行顺序梳理

async 先执行,接着执行promise,await执行返回之后,在继续执行then中内部的函数,再顺序接着执行setTimeout和setInterval。

weixin_44565776的博客 854

⑨【从0制作自己的ros导航小车:上位机篇】04、使用gmapping建图

前面的文章已经能够实现在odom坐标系下显示小车模型和里程计数据了,本文加上激光slam必不可少的传感器雷达,先进行测试,然后直接开始建图!

海风的博客 2916

吊打原版YOLOv8!ASF-YOLO多尺度融合+注意力机制实战解析(遥感/医疗/质检均适用)

ASF-YOLO融合YOLOv8的创新目标检测框架摘要 ASF-YOLO是针对小目标检测优化的先进框架,采用三重特征编码器和尺度序列融合技术增强多尺度特征提取能力。核心创新包括: 三重特征编码器(TPE)融合跨层级信息 尺度序列特征融合(SSFF)模块通过3D卷积处理多尺度信息 通道-位置注意力机制(CPAM)聚焦关键特征区域 Zoom_cat模块实现自适应多尺度特征融合 该框架特别适用于医学影像、遥感检测等小目标密集场景,通过动态特征权重调整显著提升检测精度。关键技术实现包含多尺度特征统一、3D卷积序列处

FJN110的博客 529

async 和 await 原来这么简单

进一步了解他 async 和 await,不仅仅知道他的使用

商务合作欢迎私信我 4万+

Python爬虫实战:利用Playwright与反反爬技术抓取Crunchbase企业数据

在当今数据驱动的商业环境中,获取准确的企业信息对于市场分析、竞争情报和投资决策至关重要。Crunchbase作为全球领先的企业信息平台,包含了数百万家公司、投资者和关键人员的详细数据。本文将深入探讨如何使用Python最新爬虫技术Playwright,结合多种反反爬策略,高效抓取Crunchbase企业数据。我们将从爬虫基础概念讲起,逐步深入到高级技巧,并提供完整的代码实现,帮助读者掌握现代网络数据采集的核心技术。网络爬虫技术自互联网诞生以来经历了显著演变。

2201_76125261的博客 1833

什么是async,什么是await,async和await的区别,async和await的理解

ES6 作为多年来 JavaScript 的重大版本变革,受到 JavaScript 开发者们的普遍欢迎,也正是从 ES6 (ES2015) 开始,JavaScript 版本发布变为年更,即每年发布一个新版本,以年号标识版本。在函数里,碰到await修饰的代码时,await朝后的代码都会等待。console.log("--------终于等到其它代码执行完毕----------");async 是“异步”的意思,而 await 是等待的意思,await 用于等待一个异步任务执行完成的结果。

weixin_62247681的博客 2392

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ES7——async/await理解

在最新的ES7(ES2017)中提出的前端异步特性:async、await。 什么是async、await? async顾名思义是“异步”的意思,async用于声明一个函数是异步的。而await从字面意思上是“等待”的意思,就是用于等待异步完成。并且await只能在async函数中使用 通常async、await都是跟随Promise一起使用的。为什么这么说呢?因为async返回的都是一个P...

CaseyWei 302

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ES(二)async/await理解及用法

async是属于ES7里面内容,是定义一个异步函数,该函数会返回一个 promise 对象,可以通过 .then 的形式来调用。 eg: async function resolveAfter2Seconds () { return new Promise((resolve, reject) => { setTimeout(() => { ...

一入前端深似海 2960

精雕软件(JDpaint) 5.5 绿色版

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

Promise的理解和使用,以及ES7中ASYNC/AWAIT 的使用

Promise promise 是一个 ES6 的语法 承诺的意思,是一个专门用来解决异步 回调地狱 的问题 回调函数 什么是回调函数? 就是把函数 A 当作参数传递到 函数 B 中 在函数 B 中以行参的方式进行调用 function a(cb) { cb() } function b() { console.log('我是函数 b') } a(b) 为什么需要...

Mine____的博客 477

async和await的应用

async和await 1. 介绍 什么是async和await: async 和 await 是es7技术,可以简化 Promise 操作,提高 Promise 代码的 阅读性 和 理解性; async和await结合起来,可以使得异步调用不返回Promise对象,而直接把then回调函数的第一个形参result给返回出来,使得代码更节俭,提高开发效率,也可以保证异步调用的顺序执行、减少回调地狱出现程度。 async和await的作用: 替代then()。 保证各个异步调用顺序执行,减少回调地狱。

jyn15159的博客 2765

理解 es7 async/await

简介 JavaScript ES7 中的 async / await 让多个异步 promise 协同工作起来更容易。如果要按一定顺序从多个数据库或者 API 异步获取数据,你可能会以一堆乱七八糟的 promise 和回调函数而告终。而 async / await 结构让我们能用可读性强、易维护的代码更加简洁地实现这些逻辑。 promises 在 JavaScript 中,promise 代...

weixin_34167043的博客 142

ES7前端异步玩法:async/await理解

在最新的ES7(ES2017)中提出的前端异步特性:async、await。 什么是async、await? async顾名思义是“异步”的意思,async用于声明一个函数是异步的。而await从字面意思上是“等待”的意思,就是用于等待异步完成。并且await只能在async函数中使用 通常async、await都是跟随Promise一起使用的。为什么这么说呢?因为async返回的都是一个P...

arvin_top的博客 364

理解async和await

一、先简单的介绍一下async和await ES7 提出的async 函数,终于让 JavaScript 对于异步操作有了终极解决方案。async 函数是 Generator 函数的语法糖。使用 关键字 async 来表示,在函数内部使用 await 来表示异步。 async/await 是一种编写异步代码的新方法。之前异步代码的方案是回调和 promise。 async/await 是建立在promise 的基础上 async/await 像 promise 一样,也是非阻塞的。 async/await

weixin_45731450的博客 620

async 和await 理解

async和await 是es7的特性,是从promise 里面延伸出来的新语法糖 他会将异步操作修改成同步操作,并且代码看起来更优雅 直接看例子: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</t...

wangshang1320的博客 414

解决js异步问题的方法--async和await(ES7)

异步在给我们解决阻塞的问题时也带来一些别的问题 开发中调用接口经常是异步的,然后不小心就会犯的错误就是接口的数据还没有返回,我们就当作它已经返回了,然后继续处理,当然就会发生错误。 为了避免数据还没返回就继续执行,我们一般会在回掉函数里面继续些,但当层次多的时候不免会越来越乱,可读性别差 ES6引入promise函数处理异步问题,比之前好多了,但也并没有达到像写同步一样,ES7的两个新东西解决

zcy_csdn123的博客 1867

ES7前端异步:async/await浅解

在最新的ES7(ES2017)中提出的前端异步特性:async、await。 什么是async、await? async顾名思义是“异步”的意思,async用于声明一个函数是异步的。而await从字面意思上是“等待”的意思,就是用于等待异步完成。并且await只能在async函数中使用 通常async、await都是跟随Promise一起使用的。为什么这么说呢?因为async返回的都是一个P...

qq_35605231的博客 587

深入理解ES7的async/await

在最开始学习ES6的Promise时,曾写过一篇博文 《promise和co搭配生成器函数方式解决js代码异步流程的比较》 ,文章中对比了使用Promise和co模块搭配生成器函数解决js异步的异同。 在文章末尾,提到了ES7的async和await,只是当时只是简单的提了一下,并未做深入探讨。 在前两个月发布的Nodejs V7中,已添加了对async和await的支持,今天就来对这

大灰狼的小绵羊哥哥的博客 2万+
上一篇: 解决vue-cli中webpack无法打包js变量中的图片路径
下一篇: Sequelize实现一对一,一对多,多对多关联
遛狗的代码
博客等级 码龄11年 10粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值