async/await 和 Generators + co 的写法非常的相似,只是把用于声明 Generator 函数的 * 关键字替换成了 async 并写在了 function 关键字的前面,把 yield 关键字替换成了 await;另外,async 函数是基于 Promise 的,await 关键字后面等待的异步操作必须是一个 Promise 实例,当然也可以是原始类型的值,只不过这时的执行效果等同于同步,与 Generator 不同的是,await 关键字前可以使用变量去接收这个正在等待的 Promise 实例执行后的结果。

async 函数的基本用法

async 函数返回一个 Promise 实例,可以使用 then 方法添加回调函数。当函数执行的时候,只要遇到 await 就会等待,直到 await 后面的同步或异步操作完成,再接着执行函数体内后面的语句。

ES6的声明

    // 1- 函数声明function  * fn() {}// 2- 函数表达式const * fn = function() {};

ES7的声明

// 1- 函数声明
async function fn() {}// 2- 函数表达式
const fn = async function() {};// 3- 箭头函数
const fn = async () => {};// 4- 作为对象的方法
let obj = {async fn() {}
};// 5- 作为 class 的方法
class Person(name) {constructor () {this.name = name;}async getName() {const name = await this.name;return name;}
}

使用 NodeJS 的 fs 模块连续异步读文件,第一个文件名为 a.txt,读到的内容为 b.txt,作为要读的第二个文件的文件名,继续读 b.txt 后将读到的内容 “Hello world” 打印出来。
我们来使用 async/await 的方式来实现一下:

// 引入依赖
let fs = require("fs");
let util = require("util");// 将 fs.readFile 转换成 Promise
let readFile = util.promisify(fs.readFile);// 声明 async 函数
async function read(file) {let aData = await readFile(file, "utf8");let bData = await readFile(aData, "utf8");return bData;
}// 调用 async 函数
read("a.txt").then(data => {console.log(data); // Hello world
});

与 Generator 函数一样,写法像同步,执行是异步,不同的是我们即没有手动调用 next 方法,也没有借助 co 库,其实是 async 函数内部集成了类似于 co 的执行器,帮我们在异步完成后自动向下执行代码,所以说 async/await 是 Generators + co 的语法糖。

await 异步并发

在 async 函数中,如果有多个 await 互不依赖,这种情况下如果执行一个,等待一个完成,再执行一个,再等待完成,这样是很浪费性能的,所以我们要把这些异步操作同时触发。

假设我们异步读取两个文件,且这两个文件不相关,我可以使用下面的方式来实现:

// 前置
let fs = require("fs");
let util = require("util");
let readFile = util.promisify(fs.readFile);// 方法1- 需要改进的 async 函数
async function fn() {let aData = await readFile("a.txt", "utf8");let bData = await readFile("b.txt", "utf8");return [aData, bData];
}fn();// 方法2- 在 async 函数外部触发异步
let aDataPromise = readFile("a.txt", "utf8");
let bDataPromise = readFile("b.txt", "utf8");async function fn() {let aData = await aDataPromise;let bData = await bDataPromise;return [aData, bData];
}fn();// 方法3-  使用 Promise.all
async function fn() {let dataArr = await Promise.all(readFile("a.txt", "utf8"),readFile("a.txt", "utf8"));return dataArr;
}fn();

异步并发实例

// 创建 Promise 实例
let p1 = Promise.resolve("p1 success");
let p2 = Promise.resolve("p2 success");
let p3 = Promise.resolve("p3 success");// 1-错误的处理方式  async 函数
async function fn(promises) {promise.forEach(function (promise) {await promise;});
}fn([p1, p2, p3]); // 执行时报错// 2-正确的打开方式  修改方式
async function fn(promises) {for(let i = 0; i < promises.length; i++) {await promises[i];}
}fn([p1, p2, p3]); // 正常执行

异步编程的 async/await相关推荐

  1. await原理 js_深入浅出node.js异步编程 及async await原理

    最近看了一些文章对于async await的原理及概念的解析,我觉得很多时候有些不太准确. 尤其是对于async和await会阻塞线程的说法更是有些扯淡了,JS本身就是单线程的语言如果await会阻塞 ...

  2. rust异步编程--理解并发/多线程/回调/异步/future/promise/async/await/tokio

    1. 异步编程简介 通常我们将消息通信分成同步和异步两种: 同步就是消息的发送方要等待消息返回才能继续处理其它事情 异步就是消息的发送方不需要等待消息返回就可以处理其它事情 很显然异步允许我们同时做更 ...

  3. 异步编程(async 和 await)

    1.概念 异步编程是一项关键技术,可以直接处理多个核心上的I/O阻塞和并发操作 2.使用场景 对于存在IO密集型(例如从网路请求数据.访问数据库和写入到文件系统)和CPU密集型(例如大量的计算)的任务 ...

  4. ASP.NET Core Web 应用程序系列(四)- ASP.NET Core 异步编程之async await

    PS:异步编程的本质就是新开任务线程来处理. 约定:异步的方法名均以Async结尾. 实际上呢,异步编程就是通过Task.Run()来实现的. 了解线程的人都知道,新开一个线程来处理事务这个很常见,但 ...

  5. 玩转异步 JS :async/await 简明教程(附视频下载)

    课程介绍 在软件开发领域,简洁的代码 => 容易阅读的代码 => 容易维护的代码,而 ES2017 中的 async/await 特性能让我们编写出相比回调地狱和 Promise 链式调用 ...

  6. JavaScript 异步 setTimeout promise async await

    异步在此就不再赘述,下面主要说一下JS中异步的实现方式. 1,setTimeout 计时器 ,实现代码如下 <!DOCTYPE html> <html lang="en&q ...

  7. python中的异步非阻塞 async await

    from time import time, sleep"""同步操作 """ def app01():def fn1():sleep(3) ...

  8. mysql 数据库引擎切花_asyncio异步编程【含视频教程】

    不知道你是否发现,身边聊异步的人越来越多了,比如:FastAPI.Tornado.Sanic.Django 3.aiohttp等. 听说异步如何如何牛逼?性能如何吊炸天....但他到底是咋回事呢? 本 ...

  9. python异步编程视频_asyncio异步编程【含视频教程】

    Python Python开发 Python语言 asyncio异步编程[含视频教程] 不知道你是否发现,身边聊异步的人越来越多了,比如:FastAPI.Tornado.Sanic.Django 3. ...

最新文章

  1. 角色转移服务器维护怎么回事,服务器互通及游戏角色转移说明
  2. scroll-view实现自定义下拉刷新
  3. 2020年最新Java面试题免费下载!
  4. Linux 端口占用解决
  5. 如何让Windows任务栏显示多个不同时区的时钟
  6. 一份详尽的利用 Kubeadm部署 Kubernetes 1.13.1 集群指北
  7. 安卓开发必须会的技能!浅谈Android消息机制原理,威力加强版
  8. 计算机操作系统——经典进程的同步问题
  9. python安装idle_(1)Python 安装使用IDLE
  10. BZOJ4001[TJOI2015]概率论(数学、期望、生成函数、卡特兰数)
  11. 【LeetCode-13】-罗马数字
  12. uniapp 自定义头部 支持微信、百度、头条小程序
  13. 基于51单片机霍尔汽车自行车码表测速测里程显示proteus仿真原理图PCB
  14. Spring 下默认事务机制中@Transactional 无效的原因
  15. Encoded password does not look like BCrypt的原因及解决办法
  16. 动漫人脸识别技术及数据集介绍
  17. 蓝桥杯国赛8-JavaA-2-瓷砖样式
  18. 【Android】从零开始
  19. Python调用百度AI识别身份证
  20. python中size的用法.dim_【Numpy库学习笔记】Numpy中dim、shape和size的理解

热门文章

  1. 聊聊JVM(五)从JVM角度理解线程
  2. docker-compose初试及命令基础
  3. 同实例下复制表的2种方法
  4. 鸟哥私房菜(基础篇第三版)笔记
  5. 工信部印发《信息安全产业“十二五”发展规划》
  6. 1/2 pymysql:Python连接MySQL数据库
  7. 20/100. House Robber
  8. 【感想文】感情经历,是否给你我带来的些许提升?我想,有。
  9. 关于C++/C中符号
  10. 机器学习——相似度算法汇总