写点什么

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:42717

评论

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

ARTS|Week 01 (2020第22周)

MiracleWong

算法 写作 ARTS 打卡计划

是什么奠定了架构师的职场地位?

刁架构

极客大学架构师训练营

云上基础产品之负载均衡

韩超

负载均衡 公有云

你想活出怎样的人生

Janenesome

读书笔记 思考

Go: 使用GODEBUG改善Goroutine的使用

陈思敏捷

debug 协程 Go 语言

用大数据分析了一线城市1000多份岗位招聘需求,告诉你如何科学找工作

程序员柠檬

Python 数据分析

带你学够浪:Go语言基础系列-环境配置和 Hello world

程序员柠檬

后台开发 Go 语言

谈谈控制感(12):选择什么样的工作

史方远

读书笔记 个人成长 随笔杂谈

Python 进阶与核心技术 dict & set

Bonaparte

Python 极客时间

云上基础产品之对象存储

韩超

对象存储 公有云 S3

浅说Docker基础知识与核心原理

岿然独存5

Docker 软件 Go 语言

JMM的前世今生

fkc_zyk

重排序 volatile happens-before JMM cpu

Prometheus 2.18.0 新特性

耳东@Erdong

Prometheus

一款霸榜 GitHub 的开源 Linux 资源监视器!

JackTian

GitHub Linux 开源 bashtop 资源监视器

直面一个复杂世界

史方远

读书笔记 个人成长 随笔杂谈

ARTS Week2

丽子

【摘】Git-从零单排 02期

卡尔

git 原理 开发工具 工具链

N皇后问题

孙苏勇

算法 DFS 深度优先搜索

架构之路

强哥

极客大学架构师训练营

戒掉手机吧

鼎玉谷

人生 手机 时间 浪费 控制

RocketMQ - 如何实现事务消息

Java收录阁

RocketMQ

遇事不决,请先 「搜索」

小匚

个人成长 职场 随笔杂谈

工作那么久,你还具备学习能力么?

punkboy

学习 程序员

Linux命令-df

一周思进

除了直接看余额,谁更有钱还能怎么比(二)

石君

去中心 零知识证明

带你学够浪:Go语言基础系列 - 8分钟学基础语法

程序员柠檬

程序员 后台开发 Go 语言

程序员的晚餐 | 5 月 30 日 入梅天,来一盆小龙虾

清远

美食

云上基础产品之内容分发网络

韩超

CDN 公有云 内容分发网络

云上基础产品之虚拟私有云

韩超

公有云 VPC 虚拟私有云

关于 Windows 10 2020 年 5 月更新

FeiLong

程序猿邂逅相亲妹,默默无语两行泪

码农神说

程序员 相亲

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