NodeJs-promise和async_await语法
Callback hell回调地域
当我们以同步的方式编写耗时的代码,那么就会阻塞JS的单线程,造成CPU一直等待IO完成才去执行后面的代码。
而CPU的执行速度是远远大于硬盘IO速度的,这样等待只会造成资源的浪费。
异步IO就是为了解决这个问题的,异步能尽可能不让CPU闲着,它不会在那等着IO完成;而是传递给底层的事件循环一个函数,自己去执行下面的代码。等磁盘IO完成后,函数就会被执行来作为通知。
虽然异步和回调的编程方式能充分利用CPU,但是当代码逻辑变的越来越复杂后,新的问题出现了——Callback hell回调地域!
功能代码
实现如下功能:
- 判断一个文件是文件还是目录;
- 如果是目录,读取这个目录下的文件,找出结尾是txt的文件;
- 获取这些txt文件大小。
异步方式
function withoutPromise() {
let target = "test";
fs.stat(target, (err, stat)=>{
if(err){
throw err;
}
// 如果是文件夹
if(stat.isDirectory()){
fs.readdir(target, (err, files)=>{
// 遍历files
files.forEach( f =>{
if(path.extname(f) === '.txt'){
fs.stat(path.join(target, f), (err, stat)=>{
console.log(f+ " : "+stat.size);
});
}
} );
});
}
});
}
Promise方式
async function withPromise() {
let target = "test";
//将fs.stat转为一个可以返回Promise对象的方法
let pstat = util.promisify(fs.stat);
let stat = await pstat(target);
// 如果是文件夹
if(stat.isDirectory()){
//将fs.readdir转为一个可以返回Promise对象的方法
let preaddir = util.promisify(fs.readdir)
let files = await preaddir(target)
files.forEach( async (f) => {
if(path.extname(f) === '.txt'){
let stat = await pstat(path.join(target, f));
console.log(stat.size);
}
});
}
}
Promise和async/await
Promise
和async/await
便是为了解决Callback hell的问题。
promise
promise
的作用是对异步回调代码包装一下,把原来的一个回调函数拆成2个回调函数,这样的好处是可读性更好。语法如下:
// 创建promise对象
let promise = new Promise((resolve, reject)=>{
// 在异步操作成功的情况选调用resolve,失败的时候调用reject
fs.readFile('xxx.txt',(err, data)=>{
if(err){
reject(err)
}else {
resolve(data.toString())
}
})
});
// 使用promise
promise.then((text)=>{
//then方法是当Promise内部调用了resolve的时候执行
}).catch((err)=>{
//catch方法是当Promise内部调用了reject的时候执行
console.log(err);
})
- 语法注意:Promise内部的resolve和reject方法只能调用一次,调用了这个就不能再调用了那个;如果调用,则无效。
async/await
async/await
的作用是直接将Promise异步代码变为同步的写法,注意,代码仍然是异步的。
语法要求:
await
只能用在async
修饰的方法中,但是有async
不要求一定有await
。await
后面只能跟async
方法和promise
。
假设拥有了一个promise对象,现在使用async/await可以这样写:
async function asyncDemo() {
try {
// 当promise的then方法执行的时候
let text = await promise
// 当你用promise包装了所有的异步回调代码后,就可以一直await,真正意义实现了以同步的方式写异步代码
console.log('异步道明执行');
}catch (e){
// 捕获到promise的catch方法的异常
console.log(e);
}
}
asyncDemo()
console.log('我是同步代码');
异步代码的终极写法
- 先使用
promise
包装异步回调代码,可使用node提供的util.promisify
方法; - 使用
async/await
编写异步代码。
参考
黑马程序员 120天全栈区块链开发 开源教程
https://github.com/itheima1/BlockChain
学习视频
一番同步了对应的学习视频到B站,长按识别可访问一番B站主页观看。
NodeJs-promise和async_await语法的更多相关文章
- Nodejs Promise的一点记录
项目需要,看了点nodejs,其中比较难理解的就是Promise了,记录一下学习bluebird提供的Promise实现. Promise.promisifyAll(obj)方法 作用:把对象的方法属 ...
- 03-es6语法 Promise 和 es8语法 async await 的了解和基本使用
//Promise // 1.说明 : Promise 是 es6 中提出的新语法 // 2.作用 : 用 '用户编写同步代码' 的方式 '处理异步' 的一种解决方案 // 3.以前 : 处理异步 , ...
- nodejs -Promise
创建一个 readFile.js,读取三个文件abc的内容并输出到控制台 var fs = require('fs') fs.readFile('./a.txt','utf-8',function ( ...
- nodejs promise深度解析
Promise本质上是一个容器,内部有一个执行函数,当promise对象New出来的时候,内部包裹的函数立即执行. V8引擎会将resolve和projeccted两个函数传递进来,resolved含 ...
- 【转载】游戏并发编程的讨论 & Nodejs并发性讨论 & 语法糖术语
知乎上这篇文章对于游戏后端.性能并发.nodejs及scala等语言的讨论,很好,值得好好看. https://www.zhihu.com/question/21971645 经常了解一些牛逼技术人员 ...
- es6语法中promise的使用方法
Promise是一个构造函数,它有resolve,reject,race等静态方法;它的原型(prototype)上有then,catch方法,因此只要作为Promise的实例,都可以共享并调用Pro ...
- Promise使用手册
导读 Promise问世已久, 其科普类文章亦不计其数. 遂本篇初衷不为科普, 只为能够温故而知新. 比如说, catch能捕获所有的错误吗? 为什么有些时候会抛出"Uncaught (in ...
- Promise和Generator
异同: 1.promise解决的是串行的嵌套异步问题. 2.yield把Generator Function切割为有多个出口的Generation. 3.Promise是社区的研发产物,yield是E ...
- 《深入理解ES6》笔记—— Promise与异步编程(11)
为什么要异步编程 我们在写前端代码时,经常会对dom做事件处理操作,比如点击.激活焦点.失去焦点等:再比如我们用ajax请求数据,使用回调函数获取返回值.这些都属于异步编程. 也许你已经大概知道Jav ...
随机推荐
- 实验一:通过Access划分vlan
1.配置图 Switch0的fa0/1.fa0/2.fa0/3端口设置为Access模式,PC1和PC2属于vlan 2,PC3属于vlan 3. 2.Switch0配置 3.实验现象 PC1可以pi ...
- 机器学习环境配置系列一之CUDA
本文配置的环境为redhat6.9+cuda10.0+cudnn7.3.1+anaonda6.7+theano1.0.0+keras2.2.0+jupyter远程,其中cuda的版本为10.0. 第一 ...
- linux系统iot平台编程阶段总结
1.inline内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗. 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数. 在使用循 ...
- JDBC详细说明+使用
JDBC详解 一.相关概念 1.什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提 ...
- orm 锁 和 事务
一 锁 锁的语句 select_for_update() 原生sql语句select * from t1 for update django 语句models.T1.objects.select_fo ...
- python之路:day2
本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...
- Datagrip 快捷键和常用插件持续更新一集一些使用技巧
快捷键 Ctrl+Enter:执行选中的SQL语句 Ctrl+Shift+左右箭头:调整列宽度(选中行,可以调整所有列的宽度) Ctrl+N / 双击Shift :全局搜索,点击可直接进入表 Ctrl ...
- AcWing 789.数的范围
AcWing 789.数的范围 题目描述 给定一个按照升序排列的长度为n的整数数组,以及 q 个查询. 对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数). 如果数组中不存在该元素, ...
- 死磕mysql(4)
想把论坛和博客上所有关于mysql的都看一遍,死磕到底 看到关于数据库快照的东西.......不懂,百度......然后就跑题了,看到了表锁这种东西unlock tables; 用来锁定表..... ...
- C++不同类中的特征标相同的同名函数
转载请注明出处,版权归作者所有 lyzaily@126.com yanzhong.lee 作者按: 从这篇文章中,我们主要会认识到一下几点: ...