文章目录
一、回调地狱
1.Promise对象
1.1 回调函数:当一个函数作为一个参数传入另一个函数中,并且它不会立即执行
1.2 与之相对应的概念是“同步任务”,同步任务在主线程上排队执行,只有前一个任务执行完毕,才能执行
下一个任务。异步任务不进入主线程,而是进入异步队列,前一个任务是否执行完毕不影响下一个任务的执行。
1.3回调地狱:在回调函数中嵌套回调函数。是为了实现代码顺序执行的一种方法
(1)嵌套层次很深,代码可读性很差,难以维护
(2)无法正常使用return个throw
(3)无法正常检索堆栈信息
(4)多个回调之间难以建立联系
1.4promise对象的本质:是一个异步对象,保存了异步操作的消息。(可以看作是异步消息的容器)
引入一个回调,避免更多的回调。
1.5三种状态:pending[待定] 初始状态
resloved[实现] 操作成功
rejected[被否决] 操作失败
1.6执行过程:
resolved函数:返回回调成功的消息,返回值会被.then的回调参数接收
rejected函数:返回回调失败的消息,返回值会被.catch的回调参数接收
当Promise对象的状态发生改变时,就会触发.then的回调函数
2.async
(1)async 作为一个关键字放在函数前面,用来表示该函数是异步的。它背后的原理就是promise。
(2)async 函数返回的是一个promise对象,如果要获取到promise的 返回值,我们需要用.then() 方法。
3.await
(1)await在某些情况下可以阻塞后面的代码, 可以方便的获取promise的返回值,避免深层的嵌套。
(2)await只能在async方面的里面使用,让后面的执行语句或方法要等待当前await方法的结果后才能再执行。
二、Node访问MongoDB数据库
1.MongoDB的使用场合
(1)在存储大容量、低价值数据时
(2)伸缩性强的场所
2.使用原生的MongoDB的驱动操作MongoDB数据库
(1)安装驱动模块
npm install mongodb --save
cnpm install mongodb --save
yarn add mongodb
(2)建立数据库的连接:创建MongoDB的连接客户端
const mongodbClient = require('mongodb').MongoClient;
三、Node中Mongoose模块的使用
1.使用mongoose操作MongoDB数据库
(1)什么是mongoose:是针对Node.js异步环境为MongoDB数据库提供的对象模型库
(2)操作过程:
第一步:定义模式:每个模式映射到一个MongoDB集合,定义该集合的结构:模式是一种以文件形式存储的模板,仅仅是集合的模型骨架。
示例:
//导入mongoose模块
const mongoose = require('mongoose');
//导入mongoose的Schema类,用于创建模式
const Schema = mongoose.Schema;
var connect = mongoose.createConnection('mongodb://localhost:27017/数据库名');
var departmentSchema = new Schema({
depNo:{
type:String
},
depName:{
type:String
},
createTime:{
type:Date,
default:Date.now
}
});
第二步:定义模型:是基于模式定义构建的,封装了数据属性和行为的类。
示例:
//定义模型 通过连接对象connect来创建模型
var Department = connect.model('Department',departmentSchema,'department');
第三步:创建实例:是由模块来创建
示例:
var department = new Department({
depNo:'003',
depName:'人事部'
})
第四步:通过示例来操作MongoDB数据库
示例:
//将实例保存到数据库对应的集合中:save方法
department.save((err, doc) =>{
if (err){
console.log('保存失败:',err);
throw err
}
console.log('保存成功!',doc);
})
// 使用模型的create方法插入数据
Department.create(department,(error,result)=>{
if (error){
console.log('插入失败!',error);
throw error
}
console.log('插入成功!',result);
})
//使用insertMany方法插入数据 静态方法只能通过类来调用
Department.insertMany(arr,(error,result)=>{
if (error){
console.log('插入失败',error);
throw error
}
console.log('插入成功',result);
})
// 2.查询集合
Department.find((err,data)=>{
if (err){
console.log(err);
throw err
}
console.log('查询结果',data);
})
//查询一条记录
Department.findOne({depNo:'002'},(err,data)=>{
if (err){
console.log(err);
throw err
}
console.log('查询结果',data);
})
// 3.更新操作
Department.updateOne({depNo:'004'},{$set:{depName:'公关部'}},(err,data)=>{
if (err){
console.log('更新失败',err);
throw err
}
console.log('更新成功',data)
});
// 4.删除文档
Department.remove({depNo:'001'},(err,data)=>{
if (err){
console.log('删除失败',err);
throw err
}
console.log('删除成功',data);
})
四、总结——async/await和Promise的区别
- promise是ES6出现的语法,async/await是ES7出现的语法。
- async/await相对于promise来讲,写法更加简约而干净,编写的代码可读性更高。
- 错误处理更加方便解决。
- reject状态:
(1)promise错误可以通过catch来捕捉,建议尾部捕获错误,
(2)async/await既可以用.then又可以用try-catch捕捉