js同步操作【async、await的使用】
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的使用】相关推荐
- 玩转异步 JS :async/await 简明教程(附视频下载)
课程介绍 在软件开发领域,简洁的代码 => 容易阅读的代码 => 容易维护的代码,而 ES2017 中的 async/await 特性能让我们编写出相比回调地狱和 Promise 链式调用 ...
- js异步解决方案 --- 回调函数 vs promise vs generater/yield vs async/await
javascript -- 深度解析异步解决方案 高级语言层出不穷, 然而唯 js 鹤立鸡群, 这要说道js的设计理念, js天生为异步而生, 正如布道者朴灵在 node深入浅出--(有兴趣的可以读一 ...
- js async await 终极异步解决方案
js async await 终极异步解决方案 参考文章: (1)js async await 终极异步解决方案 (2)https://www.cnblogs.com/CandyManPing/p/9 ...
- async js 返回值_JS异步编程 | Async / Await / Generator 实现原理解析
async/await实现 在多个回调依赖的场景中,尽管Promise通过链式调用取代了回调嵌套,但过多的链式调用可读性仍然不佳,流程控制也不方便,ES7 提出的async 函数,终于让 JS 对于异 ...
- node mysql await_javascript – node.js async / await与MySQL一起使...
我需要将所有结果同步并附加到带有async / await关键字的字符串,例如c# 我是node.js的新手,我无法将这种新语法适应我的代码. var string1 = ''; var string ...
- 如何使用async / await和Firebase数据库编写漂亮的Node.js API
by Paul Breslin 保罗·布雷斯林(Paul Breslin) 如何使用async / await和Firebase数据库编写漂亮的Node.js API (How to write ...
- JS 异步发展流程(回调函数=Async/await)
异步编程的语法目标,就是怎样让它更像同步编程 什么是异步? 异步任务指的是,不进入主线程.而进入"任务队列"(task queue)的任务,只有"任务队列"通知 ...
- await原理 js_深入浅出node.js异步编程 及async await原理
最近看了一些文章对于async await的原理及概念的解析,我觉得很多时候有些不太准确. 尤其是对于async和await会阻塞线程的说法更是有些扯淡了,JS本身就是单线程的语言如果await会阻塞 ...
- Node.js Async Await in ES7
原文 http://stackabuse.com/node-js-async-await-in-es7/ One of the most exciting features coming to Jav ...
- 【JS】1015- 异步编程的终极解决方案 async/await
早期的回调函数 回调函数我们经常有写到,比如: ajax(url, (res) => {console.log(res); }) 复制代码 但是这种回调函数有一个大缺陷,就是会写出 回调地狱(C ...
最新文章
- 2017 人工智能+内容生产研究报告
- jquery Fancybox插件的应用
- 修改已存在用户的所属组(usermod用法)
- 平板xmind怎么添加父主题_xmind 怎么插入子主题
- Spring的@Scheduled 动态更新cron表达式
- 符号实体(转义字符)
- Linux开机启动过程(8):初期中断(缺页中断)和异常处理
- php 实现联想式 搜索,php实现联想搜索,你会吗?_后端开发
- Coursera机器学习课后作业Matlab代码(1~9周)
- java session 例子_JavaWeb——HttpSession常用方法示例
- android最新系统排行,四大安卓系统排名,Flyme最好?
- 人才培养的金字塔模型
- 京东Cookie抓取
- PDF文件修改最常用的方式有哪些?
- [java] 汇率换算器实现(3)
- mysql实验三报告总结_数据库安全性实验报告的总结(共9篇).docx
- HDU 4960 Another OCD Patient 简单DP
- 领存技术至强 E5-2648L 6U VPX 通用密集计算刀片
- 人工智能实验报告 牧师与野人渡河 知识表示方法
- Python分类算法——多标签图像分类