写点什么

Javascript 之 async 四重奏(三)

  • 2019-12-31
  • 本文字数:1072 字

    阅读完需:约 4 分钟

Javascript之async四重奏(三)

async-await 的兼容并包

async 函数

在 es7 中引入的 async 函数使得处理异步操作更加方便:


直接在普通函数前面加上 async,表示这是一个异步函数,在要异步执行的语句前面加上 await,表示后面的表达式需要等待。我们通过下面的例子先简单了解一下:


(注:左右/上下滑动屏幕可查看全部代码)


function timeout(ms) { return new Promise((resolve) => {   setTimeout(resolve, ms); });}async function asyncPrint(value, ms) { await timeout(ms); console.log(value);}asyncPrint('hello world', 50);
复制代码


上面的代码指定 50 毫秒后输出 hello world


async 函数有多种使用方式:


// 函数声明式:


async function foo() {}


// 函数表达式:


const foo = async function () {}


// 对象的方法:


let obj = {async foo() {}}


obj.foo().then()


// 箭头函数:


const foo = async () => {}


async 函数返回一个 promise 对象,可以使用 then 方法添加回调函数:


(注:左右/上下滑动屏幕可查看全部代码)


async function f() {return 'hello world';}f().then(v => console.log(v))// "hello world"
复制代码


Await 命令后面是一个 promise 对象,如果不是会被转成一个立即 resolve 的 promise 对象:


(注:左右/上下滑动屏幕可查看全部代码)


async function f() {return await 123;}f().then(v => console.log(v))// 123
复制代码


通过 async 函数来发送多个请求:


(注:左右/上下滑动屏幕可查看全部代码)


async function dbFuc(db) {let docs = ['/posts.json', '/gets.json', '/puts.json'];let promises = docs.map((doc) => db.post(doc));let results = await Promise.all(promises);console.log(results);}
复制代码


由此可见,async 函数不仅包含了 promise、generator,代码也更加简洁。


总的来说,async 函数就是 generator 函数的语法糖,相对于 generator 函数 async 函数有以下优点:


  1. 有内置执行器,不用调用 next

  2. Generator 函数是需要调用 next 指令来运行异步的语句,async 不需要调用 next,直接像运行正常的函数那样运行就可以

  3. 有更好的语义化

  4. 语义化更明确,相比较于 Generator 的*和 yield,async 和 await 更明确。

  5. await 后面可以跟 promise 或者任意类型的值

  6. yield 命令后面只能是 Thunk 函数或 Promise 对象,而 async 函数的 await 命令后面,可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操作)。

  7. 返回一个 promise 对象,可以调用.then

  8. async 直接返回一个 promise 对象,可以用 then 和 catch 来处理。


本文转载自 Think 体验设计公众号。


原文链接:https://mp.weixin.qq.com/s/QgC2OjVF4pvltte9V_gkIQ


2019-12-31 15:42624

评论

发布
暂无评论
发现更多内容

与 NGINX 团队直接交流 | 微服务之月火热报名中

NGINX开源社区

nginx 微服务 运维

Wallys /MediaTek MT7915 DR7915/Wi-Fi 6 Wave 1+ chipset/support openwrt

Cindy-wallys

MT7915

NFTScan 与 WalletFrens 达成合作伙伴,由 NFTScan 为其提供多链 NFT 数据服务!

NFT Research

合作 NFT\

数智人力带您揭秘:项目型组织降低人力成本背后的秘诀

用友BIP

数智人力

Downie 4 for Mac(最好用的视频下载软件)

背包客

macos Mac软件 mac软件下载 Downie 4 Mac版 Downie4

HStore表全了解:实时入库与高效查询利器

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 6 月 PK 榜

Vue-路由器的两种工作模式(history和hash)

不觉心动

6 月 优质更文活动

科兴未来|第七届“红船杯”嘉兴全球创业创新大赛开启报名

科兴未来News

数字经济 新能源 生物医药 新材料 高端装备

开源赋能 工业铸魂|2023开放原子全球开源峰会开源工业软件分论坛圆满举行

开放原子开源基金会

开源 开放原子全球开源峰会 开源工业软件

为开发者打造的开源低代码开发平台

力软低代码开发平台

Vue路由守卫-前置路由守卫(beforeEach)

不觉心动

6 月 优质更文活动

局域网办公的重要性,如何选择企业IM即时通讯APP?

BeeWorks

软件测试/测试开发丨学习笔记之Python函数

测试人

Python 程序员 软件测试 自动化测试 函数

大型企业高质量发展第一步,构建全面预算管理体系!

用友BIP

全面预算 财务共享

财务共享数字化转型是财务管理的未来

用友BIP

财务共享

大型企业在财务共享和财务数智化转型上,如何对标世界一流

用友BIP

财务共享

数据驱动,支撑企业数智化平台升级

用友BIP

数智平台

业务与应用同步发展:应用现代化的策略建议

NGINX开源社区

AI+低代码:开发革命的崭新纪元!带你一文速通了解

加入高科技仿生人

AI 低代码 数智转型

如何实现大型企业全面预算管理?

用友BIP

全面预算 财务共享

VSCode批量迁移插件

Geek_7ubdnf

假如你是CEO,遇到人才瓶颈又该如何破局?数智人力给您答案!

用友BIP

人力资源 数智人力

vue使用Element-ui组件库-按需引入

我搬去水星了

6 月 优质更文活动

vue使用Element-ui组件库-完整引入

我搬去水星了

6 月 优质更文活动

Linux常用命令

Geek_7ubdnf

集群限流功能是如何实现的?

互联网架构师小马

Java sentinel 集群限流

Sentinel支持异步调用链的实现原理

互联网架构师小马

Java sentinel

香港便宜虚拟主机:高性能、低成本,让你的网站事半功倍!

一只扑棱蛾子

香港主机 香港便宜虚拟主机

集群限流的两种模式

互联网架构师小马

Java 集群限流

数智人力帮您搭建人才梯队,从此挖掘人才不再靠缘分!

用友BIP

数智人力

Vue-后置路由守卫(afterEach)以及独享路由守卫(beforeEnter)

不觉心动

6 月 优质更文活动

Javascript之async四重奏(三)_语言 & 开发_Think体验设计_InfoQ精选文章