Promise
什么是promise
axios是基于promise实现的,例如axios.get返回的就是一个promise的对象,所以能够调用.then方法
概述
promise是解决js中异步编程的完美解决方案
背景
没有promise之前,实现异步的做法:使用回调函数
使用回调函数产生的问题
回调地狱
- 1 回调嵌套回调,看起来很丑(可读性差)
- 2 异步体现不直观(代码执行顺序与正常思维顺序不一致)
- 3 再解决复杂异步问题时,就变的很棘手
使用promise解决回调函数的问题 - 1 可读性更好,不用层层回调嵌套了
- 2 看起来更加直观,因为:使用 Promise 就是以一种同步的方式来编写异步代码
- 3 很容易解决复杂的异步问题
promise的使用
- 1 Promise 是一个构造函数
- 2 可以将 Promise 看作一个容器,内部封装了异步操作
- 3 Promise的参数是一个回调函数
- 4 回调函数有两个参数:
resolve
表示成功的回调函数,也就是:当异步操作执行成功时,应该调用这个函数
reject
表示失败的回调函数,也就是:当异步操作执行失败时,应该调用这个函数 - 5.说明
then表示成功,当异步操作成功时,这个回调函数就会调用
理解:Promise内部调用的 resolve 相当于就是调用了then中的回调函数,并且,如果 resolve 调用的时候传递了参数,还可以通过 then 中的回调函数来获取到这个参数
catch表示失败,当异步失败时,这个回调函数会被调用
注意 - 1.错误被 catch 捕获后,后面的 catch 就不会再执行了
- 2..then后面也可以指定第二个回调函数,当异步操作失败时,第二个回调函数的代码就会执行了
promise的状态转换
三种状态
pending
等待中
resolved
成功
rejected
失败
默认的状态是 pending
调用成功的回调函数
pending-->resolved
调用失败的回调函数
pending-->rejected
注意点
状态只能改变一次,也就是说:只要状态发生改变了,就不会再次发生改变
promise的几个常用的方法
需求1
有三个异步请求,等到这三个异步请求都完成的时候,再执行某个操作
Promise
.all([p1, p2, p3])
.then(res => {})
需求2
有三个异步请求,只要这三个异步请求中有一个完成了,就执行某个操作
Promise
.race([p1, p2, p3])
.then(res => {})
async和await
js中的异步编程的终极解决方案
依赖性
这两个关键字用来实现异步编程,是依赖于 Promise 的
注意点
- 1 await 只能用在 async 函数中!!!
- 2 添加 async 的规则是:就近原则,一定要加载使用 await 关键字的函数中
说明
async
就是用来修饰这个函数,也就是告诉JS解析引擎这个函数中包含了 await 这样的关键字处理的 异步操作
await
会等到后面的异步操作完成。异步操作完成后,后面的代码才会执行
后面可以跟任意的表达式,但是,一般都会跟着一个 promise 对象,也就是一个异步操作
网友评论