Promise 、Async与Await
前言:
该笔记记录了Promise 的方法与特点,以及之前在面试被问到的面试题
Promise的理解:
- 它是js的原生对象,是一种异步编程解决方法,可替换掉传统的回调函数解决方法
- 简单理解它是一个容器,里面保存着某个未来才会结束的事件(异步操作)的结果
- 从语法上来说:他是一个构造函数
- 从功能上来说:他是一个对象,用来封装异步操作并可以获取结构值
回调地狱(如下图):当回调函数嵌套着回调函数,这样不断的嵌套,就造成了 回调地狱
Promise的特点:
- 他有三个状态、pending(未完成)、fulfilled(已完成)、rejected(失败)
- 他的状态发生改变之后,就不会在变了
- 它可以then()方法链式调用,回调是同步的,then是异步的
先简单 new 一个Promise :
Promise的异步操作与方法:
resolve (成功) 与 reject (失败):
catch()方法 :
pormoise异步操作失败是,递交失败结果时,就可以用到catch方法 ,携带的参数就会被调用并获取错误原因
then ( ) 方法:
它返回的是一个新的Promise实例; 它可以链式调用,PP.then().then().then().,… ,这也是promise的精髓,用来解决回调地狱
then接受参数:1、Resolved状态成功时的回调(必填)2、Resolved状态失败时的回调(非必填);如下图
catch方法只能处理发生的错误,then方法不但把自己的工作做了,他会去取代catch方法的工作(卷王)
all ( )方法:
它与then方法同级,它在所有异步操作执行完毕 且 所以的操作结果成功时,他才会执行回调
any()方法:
它与all方法恰恰相反,它只要有处理一个成功执行的函数就成功,它就返回那个已经成功的 promise,全部失败就全部返回错误
race()方法:
它与all更加相反了,谁先执行完成就先执行回调,不管成功回调还是失败回调,其余的就不在执行
Promise 被面试到的面试题:
1、如何改变promise的状态?
- .resolve(value): 如果当前是 pending 就会变为 resolved
- .reject(reason): 如果当前是 pending 就会变为 rejected
- .抛出异常(throw): 如果当前是 pending 就会变为 rejected
2、有10万条接口,一次只能请求50条(不能超过),请求过程中,有成功的话,就继续补满50条,让他继续请求
(一个水桶装50条,请求成功就等于漏掉一点水,一漏掉就补满这个水桶)如何实现?
Async 与 Await
它也是用来处理异步操作的。(终极武器)
- 它们两者是相互配合使用的,但await不能独立使用,必须的配合async使用
- async可以独立工作,声明一个函数异步的(用同步的方式进行异步的代码)
- 它们两者的工作方式等同于generator函数的工作方式(可以说是他的语法糖)
- 它一般会返回一个promise
他们类似这种,拦路,标记,检查,不然不能继续往下走
如果await后面跟着得是个函数,它一般会返回的是一个promise,那么他等待的就是promise的成功状态结果
如果函数返回的不是promise,那么他等待的是函数返回的值