一、认识Promise
(1)Promise是异步操作的一种解决方案
①异步操作
(2)什么时候使用Promise:一般用来解决层层嵌套的回调函数的问题(回调低于callback hell)的问题
(3)promise(回调函数)实例化构造函数生成实例对象
①promise解决的不是回调函数,而是回调地狱
②promise的状态,promise只有pending->fulfilled或者pending->rejected状态,当Promise状态发生了改变就不会再改变了
1、pending:初始状态
2、fulfilled:成功状态,调用了resolve
3、rejected:失败状态
③then(成功函数,失败函数)方法,
④data接受成功状态的参数,err接收失败的参数
(4)then()方法
①当pending->fulfilled时,执行then的第一个回调函数
当pending->rejected时,执行then的第二个回调函数
②执行后的返回一个新的promise对象(成功态),then后面还可以then
③then方法返回的Promise对象的状态改变,此此时会输出err和success2
④在then的回调函数中,return后面的东西会用Promise包装一下等价于下图,所以再then一次默认是成功态Promise
⑤如果想让它成为失败态则可以自己写一个返回值
⑥使用Promise和then解决回调地狱的问题
1.当使用回调函数来控制盒子时,如果需要改变小球的移动,修改代码会变得很麻烦因为这是一个嵌套的模式
2.利用promise对move函数进行改造,如果需要交换动画的位置时可以随便改变,因为这是一个横向的结构互不影响
(5)catch专门用来处理rejected状态,catch本质上是then的特例
①基本用法:捕获前面的错误,一般总是建议,
Promise对象后面要跟catch方法,这样可以处理Promise内部发生的错误,可以使用throw new Error来制造一个新的错误
(6)finally ()只要Promise状态发生变化,无论发生什么状态就会执行,不发生变化则不执行
①finally不接收参数
②本质:也是then()方法的一个特例
二、构造函数方法
(1)Promise.resolve():是成功状态Promise的一种简写形式
(2)参数
①一般参数
②Promise作为参数:后面then方法的回调函数执行哪一个取决于传入的Promise
③具有then方法的对象作为参数,则会执行then函数
(3)Promise.reject():失败
①参数:不管什么参数,都会原封不动的向后传递,作为后续方法的参数
(4)Promise.all()关注多个Promise对象的状态变化,传入多个Promise实例,包装成一个新的Promise实例返回
①Promiseall()的状态变化与所有传入的Promise实例对象状态有关
②所有状态都变成resolved,最终的状态才会变成resolved
③只要有一个变成rejected,最终的状态就会变成rejected
(5)Promise.race()
①Promise.race()的状态取决于第一个完成Promise实例对象,如果第一个完成的成功了,那最终就成功,如果第一个完成的失败了,那最终的就失败
(6)Promise.Settled()的状态与传入的Promise的状态无关永远它都只会忠实的记录下各个PRomise的表现
三、注意事项
(1)resolve或reject函数执行后的代码
①推荐在调用resove或reject函数的时候加上returna,不再执行它们后面的代码
(2)Promise.all/rece/allSettled的参数问题
①参数如果不是Promise数组,会将不是Promise的数组元素转变成Promise对象
②只要是任何可遍历的都可以作为参数(数组、字符串、set、map、nodelist、arguments
(3)错误处理
三、await 和async相当于是promise的一个语法糖
(1)当async执行后他的输出的结果是一个Promise对象,而且是已完成的
同样的我们可以让async里面返回一个promise,并且调用then来接受状态
(2)await相当于就是then,如下,then通过回调函数,来接收返回值