1>什么是Promise
Promise是异步编程的一种解决方案,它简单来说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
Promise对象有两个特点:
1)对象的结果不受外界影响:Promise对象代表有一个异步操作,有三个状态
fulfilled可以理解为成功的状态;
rejected 可以理解为失败的状态;
pending既不是成功状态也不是失败状态;可以理解为Promise对象实例创建时候的初始状态;
只有异步操作的结果才能决定当前是那一种状态,任何其他操作都无法改变这个状态
- 一旦状态改变,就不会再改变,任何时候都可以得到这个结果。Promise对象的状态改变只有两种可能性,从pending到fulfilled,和从pending到rejected,只要这两种情况发生,状态就会凝固,不会再改变,会一直保持这种状态。
2>我们为什么要使用Promise对象
Promise对象可以将异步操作以同步操作的流程表达出来,避免层层嵌套的回调函数,此外Promise对象提供统一的接口,使得控制异步操作更加容易
比如我们在工作中经常会碰到这么一个需求,比如我使用ajax发一个A请求后,成功后拿到数据,我们需要把数据传给B请求;
使用我们一般jq的写法代码会有以下缺点:
1)后一个请求需要依赖于前一个请求成功后,将数据往下传递,会导致多个ajax请求嵌套的情况,代码不够直观。
2)如果前后两个请求不需要传递参数的情况下,那么后一个请求也需要前一个请求成功后再执行下一步操作,这种情况下,那么也需要如上编写代码,导致代码不够直观。
针对这种情况我们可以使用Promise对象来解决
3>创建Promise
1)创建对象方法:
一.New Promise
let promise = new Promise(function(resolve, reject) {
console.log('Promise');
resolve();});
promise.then(function() {
console.log('resolved.');});
console.log('Hi!');
// Promise// Hi!// resolved
对通过new 生成的promise对象为了设置其值在resolve(成功) / reject(失败) 时调用的回调函数,可以使用promise.then()实例方法。
- Promise.resolve
Promise.resolve('foo')// 等价于
new Promise(resolve => resolve('foo'))
Promise.resolve(11).then(function(value){
console.log(value); // 打印出11
});
- 理解Promise.reject
const p = Promise.reject('出错了');// 等同于
const p = new Promise((resolve, reject) => reject('出错了'))
实例方法:
1)promise.then(onFulfilled, onRejected);成功和失败时都可以使用,resolve(成功) 时 调用onFulfilled 方法,reject(失败) 时 调用onRejected方法;
理解:
采用链式的then,可以指定一组按照次序调用的回调函数。它的执行过程是前一个回调函数,返回的还是一个Promise对象(即有异步操作),这时后一个回调函数,就会等待该Promise对象的状态发生变化,才会被调用。
var promise1 = new Promise(function(resolve){
resolve(2);
});
promise1.then(function(value){
return value * 2;
}).then(function(value){
return value * 2;
}).then(function(value){
console.log("1"+value);
});
打印出18,即 “1” + 2*2*2 = 18;
不管是then还是catch方法调用,都返回一个新的promise对象;
2)promise.catch(onRejected);如果出现异常的情况下可以采用这种方法,也可以写成
promise.then(undefined,onRejected)只指定onRejected回调函数即可
3)Promise.finally:不管promise最后的状态是成功还是失败最后都会执行finally方法指定的回调函数。
promise.then(result => {路路路}).catch(error => {路路路}).finally(() => {路路路});
4)Promise.all:是将多个 Promise 实例,包装成一个新的 Promise 实例。它可以接受一个元素为Promise对象的数组作为参数,当这个数组里面所有的promise对象都变为resolve或者rejected时,该方法才会返回。Promise.all方法中会按照数组的原先顺序将结果返回;
var promise1 = new Promise(function(resolve){
setTimeout(function(){
resolve(1);
},3000);
});
var promise2 = new Promise(function(resolve){
setTimeout(function(){
resolve(2);
},1000);
});
Promise.all([promise1,promise2]).then(function(value){
console.log(value); // 打印[1,2]
});
5)Promise.race:同样是将多个 Promise 实例,包装成一个新的 Promise 实例。
它的含义是只要有一个promise对象进入FulFilled或者Rejected状态的话,程序就会停止,且会继续后面的处理逻辑;
const p = Promise.race([p1, p2, p3]);
只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。