Promise的与async/await的使用

一、回调地狱
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的区别
  1. promise是ES6出现的语法,async/await是ES7出现的语法。
  2. async/await相对于promise来讲,写法更加简约而干净,编写的代码可读性更高。
  3. 错误处理更加方便解决。
  4. reject状态:
    (1)promise错误可以通过catch来捕捉,建议尾部捕获错误,
    (2)async/await既可以用.then又可以用try-catch捕捉
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值