Promise学习笔记

61 阅读2分钟

一、为什么要用Promise?

JavaScript代码是单线层程序,所以在执行时是按照顺序执行的,对于一些简单的操作时主线程可以满足,但是如果在同步程序中发送网络请求,在网速不稳定情况下,会发生超时情况,如果再按照同步加载,这时网页就会没有响应,所以出现异步概念。异步不再是顺序执行,在发送网络请求时,异步是最佳选择,不会出现原地等待,会继续执行后面代码,主线程不关心异步任务的状态,自己完成回调后续的操作,程序之间互不影响,因此异步执行效率更高。

在异步操作调用获取到结果后,会产生回调,在发送多个异步请求并且之间需要依赖时就得使用嵌套方式,这就会出现“回调地狱”。回调地狱的出现使代码维护起来非常麻烦,这时用到Promise来进行解决“回调地狱”问题。

二、什么是Promise?

Promise是解决异步的方法,是一个构造函数,用它实例化一个对象。实例化时传入的参数是一个函数,函数中接收两个参数:resolve(成功后调用)、reject(失败后调用)

image.png

调用resolve函数时,执行Promise对象的then方法传入回调获取

image.png

调用reject函数时,执行Promise对象的catch方法传入回调获取

image.png

Promise对象有三种状态: (1)pending(初始状态/进行中) 创建Promise对象时,没有调用resolve或reject方法。

image.png

(2)resolved或fulfilled(成功)函数调用了resolve方法。

image.png

(3)rejected(失败) 调用了reject函数。

image.png

Promise.all()方法

实现并行执行异步操作,在所有异步操作完成后统一返回所有结果。

Promise.all()接收一个Promise[ ],返回一个Promise实例,当所有的 Promise 执行完毕并且都是"resolved"(fulfilled)时,该实例的状态才会变为"resolved"(fulfilled)。 如果 Promise 队列中所有的实例状态都是"resolved"(fulfilled),那么Promise.all( )返回的实例的状态就会变为"resolved"(fulfilled),并且"resolved"(fulfilled)的参数是一个数组,按照顺序放置队列中每个 Promise 成功后的结果。

image.png

image.png

只要队列中有一个实例的状态是"rejected",那么该实例的状态也会变为"rejected"

image.png

image.png

如果队列中 Promise 实例有一个是rejected,那么Promise.all()返回的实例就会变为rejected状态,并且reject()参数是队列中第一个rejected的返回值

image.png

image.png

Promise的链式调用:

.then的链式调用

image.png

总结

  • Promise是JS中用来解决回调地狱的方法
  • Promise实例对象代表一个异步操作
  • Promise实例对象可以通过原型链方法访问.then方法