写点什么

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

评论

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

Spring-技术专题-设计模式和研究分析

码界西柚

spring 设计模式 原理分析 5月日更

融云亮相 CDEC2021 上海站 全场景通信能力赋能企业数字升级

融云 RongCloud

一次过透气浆、印一次透气浆

C13713145387

透气胶浆 一次过透气浆

Google官方关闭binary后,Android工程师怎么办?

Changing Lin

5月日更

立体水性石头拉浆

C13713145387

太简单了!这套Java异常处理的总结,80%的人都没看过

牛哄哄的java大师

Java

模块三作业:消息队列详细设计文档

薛定谔的指南针

架构实战营

OAuth 2.0 与 OIDC

Zhang

OAuth 2.0 OIDC

一文抽丝剥茧带你掌握复杂Gremlin查询的调试方法

华为云开发者联盟

调试 图数据库 Gremlin 遍历源 图遍历

架构实战营模块三作业

日照时间长

架构实战营

自研消息队列架构设计文档

菠萝吹雪—Code

架构实战营

Java中用户线程和守护线程区别这么大?

王磊

Java 并发编程 多线程 5月日更

采取有效云网络安全策略的5个基本步骤

云计算

华云大咖说 | 安超DCM给数据中心“做主”

华云数据

哑面爽滑肤感胶浆

C13713145387

哑面爽滑肤感胶浆

牛仔底色保护浆(喷砂工艺)

C13713145387

牛仔底色保护浆

弹力抗刮硅油布胶浆

C13713145387

弹力抗刮硅油布胶浆

入门到精通!阿里码农熬了2晚整理的Java工具,真香

飞飞JAva

Java java工具类

NumPy之:结构化数组详解

程序那些事

Python 数据分析 Numpy 程序那些事

夏季不塞网胶浆、夏季不堵网胶浆

C13713145387

夏季不塞网胶浆

聊聊我的编程时如何入门的

C语言与CPP编程

c++ 编程 程序人生 C语言 数据结构与算法

算法训练营 - 学习笔记 - 第五周

心在飞

哑面防水尼龙胶浆Nylon printing paste

C13713145387

哑面防水尼龙胶浆

MySQL数据迁移那些事儿

Simon

MySQL 数据迁移

水性硅胶防滑透明浆

C13713145387

水性硅胶防滑透明浆

4.2 Go语言从入门到精通:延迟函数 defer

xcbeyond

defer Go 语言 5月日更

展开说说,Spring Bean IOC、AOP 循环依赖

小傅哥

Java spring 小傅哥 ioc 循环依赖

爽面弹力胶浆、哑面弹力胶浆

C13713145387

爽面弹力胶浆

不反粘水性台板胶Waterborne table glue

C13713145387

不反粘水性台板胶

打破思维定式(二)

Changing Lin

5月日更

postgresql数据库 timescaledb 时序库 超级表 块的压缩(compress_chunk()的应用)

Yang

数据库 postgresql

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