async/await

1.Async/Await简介

使用async/await,你可以轻松地达成之前使用生成器和co函数所做到的工作,它有如下特点:

  • async/await是基于Promise实现的,它不能用于普通的回调函数。
  • async/await与Promise一样,是非阻塞的。
  • async/await使得异步代码看起来像同步代码,这正是它的魔力所在。

一个函数如果加上 async ,那么该函数就会返回一个 Promise

async function async1() {return "1"
}
console.log(async1()) // -> Promise {<resolved>: "1"}

Generator函数依次调用三个文件那个例子用async/await写法,只需几句话便可实现

let fs = require('fs')
function read(file) {return new Promise(function(resolve, reject) {fs.readFile(file, 'utf8', function(err, data) {if (err) reject(err)resolve(data)})})
}
async function readResult(params) {try {let p1 = await read(params, 'utf8')//await后面跟的是一个Promise实例let p2 = await read(p1, 'utf8')let p3 = await read(p2, 'utf8')console.log('p1', p1)console.log('p2', p2)console.log('p3', p3)return p3} catch (error) {console.log(error)}
}
readResult('1.txt').then( // async函数返回的也是个promisedata => {console.log(data)},err => console.log(err)
)
// p1 2.txt
// p2 3.txt
// p3 结束
// 结束

2.Async/Await并发请求

如果请求两个文件,毫无关系,可以通过并发请求

let fs = require('fs')
function read(file) {return new Promise(function(resolve, reject) {fs.readFile(file, 'utf8', function(err, data) {if (err) reject(err)resolve(data)})})
}
function readAll() {read1()read2()//这个函数同步执行
}
async function read1() {let r = await read('1.txt','utf8')console.log(r)
}
async function read2() {let r = await read('2.txt','utf8')console.log(r)
}
readAll() // 2.txt 3.txt

总结

1.JS 异步编程进化史:callback -> promise -> generator -> async + await

2.async/await 函数的实现,就是将 Generator 函数和自动执行器,包装在一个函数里。

3.async/await可以说是异步终极解决方案了。

(1) async/await函数相对于Promise,优势体现在:

  • 处理 then 的调用链,能够更清晰准确的写出代码
  • 并且也能优雅地解决回调地狱问题。

当然async/await函数也存在一些缺点,因为 await 将异步代码改造成了同步代码,如果多个异步代码没有依赖性却使用了 await 会导致性能上的降低,代码没有依赖性的话,完全可以使用 Promise.all 的方式。
(2) async/await函数对 Generator 函数的改进,体现在以下三点:

  • 内置执行器。

Generator 函数的执行必须靠执行器,所以才有了 co 函数库,而 async 函数自带执行器。也就是说,async 函数的执行,与普通函数一模一样,只要一行

  • 更广的适用性。

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

  • 更好的语义。

async 和 await,比起星号和 yield,语义更清楚了。async 表示函数里有异步操作,await 表示紧跟在后面的表达式需要等待结果。

js同步操作【async、await的使用】相关推荐

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

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

  2. js异步解决方案 --- 回调函数 vs promise vs generater/yield vs async/await

    javascript -- 深度解析异步解决方案 高级语言层出不穷, 然而唯 js 鹤立鸡群, 这要说道js的设计理念, js天生为异步而生, 正如布道者朴灵在 node深入浅出--(有兴趣的可以读一 ...

  3. js async await 终极异步解决方案

    js async await 终极异步解决方案 参考文章: (1)js async await 终极异步解决方案 (2)https://www.cnblogs.com/CandyManPing/p/9 ...

  4. async js 返回值_JS异步编程 | Async / Await / Generator 实现原理解析

    async/await实现 在多个回调依赖的场景中,尽管Promise通过链式调用取代了回调嵌套,但过多的链式调用可读性仍然不佳,流程控制也不方便,ES7 提出的async 函数,终于让 JS 对于异 ...

  5. node mysql await_javascript – node.js async / await与MySQL一起使...

    我需要将所有结果同步并附加到带有async / await关键字的字符串,例如c# 我是node.js的新手,我无法将这种新语法适应我的代码. var string1 = ''; var string ...

  6. 如何使用async / await和Firebase数据库编写漂亮的Node.js API

    by Paul Breslin 保罗·布雷斯林(Pau​​l Breslin) 如何使用async / await和Firebase数据库编写漂亮的Node.js API (How to write ...

  7. JS 异步发展流程(回调函数=Async/await)

    异步编程的语法目标,就是怎样让它更像同步编程 什么是异步? 异步任务指的是,不进入主线程.而进入"任务队列"(task queue)的任务,只有"任务队列"通知 ...

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

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

  9. Node.js Async Await in ES7

    原文 http://stackabuse.com/node-js-async-await-in-es7/ One of the most exciting features coming to Jav ...

  10. 【JS】1015- 异步编程的终极解决方案 async/await

    早期的回调函数 回调函数我们经常有写到,比如: ajax(url, (res) => {console.log(res); }) 复制代码 但是这种回调函数有一个大缺陷,就是会写出 回调地狱(C ...

最新文章

  1. 2017 人工智能+内容生产研究报告
  2. jquery Fancybox插件的应用
  3. 修改已存在用户的所属组(usermod用法)
  4. 平板xmind怎么添加父主题_xmind 怎么插入子主题
  5. Spring的@Scheduled 动态更新cron表达式
  6. 符号实体(转义字符)
  7. Linux开机启动过程(8):初期中断(缺页中断)和异常处理
  8. php 实现联想式 搜索,php实现联想搜索,你会吗?_后端开发
  9. Coursera机器学习课后作业Matlab代码(1~9周)
  10. java session 例子_JavaWeb——HttpSession常用方法示例
  11. android最新系统排行,四大安卓系统排名,Flyme最好?
  12. 人才培养的金字塔模型
  13. 京东Cookie抓取
  14. PDF文件修改最常用的方式有哪些?
  15. [java] 汇率换算器实现(3)
  16. mysql实验三报告总结_数据库安全性实验报告的总结(共9篇).docx
  17. HDU 4960 Another OCD Patient 简单DP
  18. 领存技术至强 E5-2648L 6U VPX 通用密集计算刀片
  19. 人工智能实验报告 牧师与野人渡河 知识表示方法
  20. Python分类算法——多标签图像分类

热门文章

  1. 《After Effects CC 中文版超级学习手册》课程教学(23)——附录 AE CC 快捷键
  2. 使用AURIX-v1.6.0导入龙邱库
  3. vue3 实现可分页打印功能
  4. 问题 J: 二叉树遍历
  5. eap协议 c语言,EAP协议分析.ppt
  6. (通达信)公式源码导入和使用方法
  7. 新手唱歌从入门到精通,经典唱歌教程系列合集
  8. 控制系统与仿真CAD(2)——Matlab语言程序设计基础part1
  9. HealthKit开发快速入门教程之HealthKit的主要类型数据
  10. 美国数据隐私管理平台BigID获3000万美元融资