写点什么

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

评论

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

Xcode:mac开发工具下载

Rose

NineData ChatDBA发布重大更新,准确率飙升

NineData

数据库 大模型 ChatGPT NineData ChatDBA

GreptimeDB v0.10 重磅上线:日志场景增强、功能性能双重升级

Greptime 格睿科技

数据库 日志 版本

南京大学苏州校区学生代表团到访合合信息,开启“沉浸式”人工智能企业行

合合技术团队

人工智能 科技 校企合作 南京大学

VTS:基于Apache SeaTunnel的开源向量数据迁移工具

白鲸开源

GitHub 数据集成 Apache SeaTunnel 开源、 VTS

超详细!!传统NLP算法结合大模型私有化部署简易知识问答体系工程实践

京东科技开发者

Java分析工具 JProfiler mac破解版+安装教程

Rose

强大的跨平台的SSH、Telnet和SFTP客户端 Termius for mac直装激活版

Rose

DICT项目支撑的破局之道,提升之路

鲸品堂

提效降本 企业号 2024年11月PK榜

教你一招,轻松玩转HyperWorks网格变形

智造软件

仿真 CAE软件 Hypermesh

java小知识-纳秒

京东科技开发者

流式细胞分析 FlowJo 10 for Mac 破解安装教程

Rose

最好用的mac效率工具 Alfred 4 for mac汉化版安装包

Rose

专访丨大模型存储新王牌,焱融科技如何引爆AI竞争力

焱融科技

人工智能 文件存储 大模型 全闪存储

2024华为云开源开发者论坛完整议程揭晓,云原生专场邀您共探前沿技术!

华为云原生团队

云计算 容器 云原生 Volcano kubeedge

从孤岛到协同,集成式财务规划的未来

智达方通

数据孤岛 业财融合 集成式财务协作 财务协作

Python多任务编程在软件测试中的应用

测试人

软件测试

测试右移之——监控告警中心优化与建设策略

京东科技开发者

如何打包CST仿真结果

思茂信息

cst cst使用教程 cst操作 cst电磁仿真 CST软件

Minitab Express 助力,让数据统计变得轻而易举

Rose

macOS剪切板管理工具 Paste for Mac 中文免激活版

Rose

人工智能的应用现状

天津汇柏科技有限公司

AI 人工智能

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