promise是什么?
- promise是异步编程的一种解决方案
- promise简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步的操作)结果
- 从语法上说,promise是一个对象,从它可以获取异步操作的信息
为什么使用promise
- 解决回调地狱
- 为了我们的代码更加具有可读性和维护性,需要将数据请求与数据处理明确的区分开来
关于回调地狱
在JavaScript的世界中,所有代码都是单线程执行的,由于这个缺陷,导致jjavascript的所有网络操作,浏览器事件,都必须是异步执行,异步执行可以用回调函数实现。异步操作会在将来的某个时间点触发一个函数调用,ajxa就是典型的异步操作。 调用ajax请求的时候难免会遇到一个接口需要另一个接口的数据来获取,往往我们会直接将那个接口直接写在上一个接口的回调函数里,但是它增加了函数的嵌套深度也会造成一定的逻辑混乱,如果多几个接口嵌套就比较糟心了,这就是回调地狱。而promise的出现就是为了解决万恶的回调函数的!
promise的特点
1. 对象的状态不受外界影响
promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(以失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其它操作都无法改变这个状态。这也是promise这个名字的又来,它的英语意思就是“承诺”,表示其它手段无法改变。
2. 一旦状态改变,就不会在变,任何时候都可以得到这个结果
promise对象的状态改变,只有两种可能,从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会在变了。会一直保持这个结果,这时就成为resolved(已定型)。如果改变已经发生了,你在对promise对象添加回调函数,也会立即得到这个结果。这与事件(event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
promise的优点
有了promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,promise对象提供统一的接口,使得控制异步操作更加容易。
1. promise是一个对象,对象和函数的区别就是对象可以保存状态,函数不可以(闭包除外)
2. 并未剥夺函数return的能力,因此无需层层传递callback,进行回调获取数据
3. 代码风格容易理解,便于维护
4. 多个异步等待合并便于解决
promise的缺点
1. 无法取消promise,一旦新建它就会立即执行,无法中途取消。
2. 如果不设置回调函数,promise内部抛出的错误,不会反应到外部。
3.当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)
promise的一些方法
静态方法
1. promise.resolve()
2. promise.reject()
3. promise.all()
4. promise.rece()
实例方法1. promise.then(resolved,rejected)
2. .catch(rejected)
3. finally()
.then()
- 接收两个函数作为参数,分别代表fulfilled(成功)和rejected(失败)
- .then()返回一个新的Promise实例,所以它可以链式调用
- 当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行
- 状态响应函数可以返回新的promise,或其他值,不返回值我们可以认为它返回了一个null
- 如果返回新的promise,那么下一级.then()会在新的promise状态改变之后执行
- 如果返回其他任何值,则会立即执行下一级.then()
- .then()里面有.then()的情况
因为.then()返回的还是Promise实例,会等里面的then()执行完,再执行外面的
Promise.all() 批量执行
- Promise.all([p1, p2, p3])用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise
- 它接收一个数组作为参数
- 数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变
- 当所有的子Promise都完成,该Promise完成,返回值是全部值的数组
- 有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果
- Promise.all可以将多个Promise实例包装成一个新的Promise实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。
- Promse.race就是赛跑的意思,意思就是说,Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态