JS的ES6的Promise
一.Promise
1.什么是Promise对象:代表未来某个将要发生的事件,一般指的是异步操作。
2.Promise对象
-
存在的目的:将异步操作以同步的流程表达出来,避免层层嵌套的回调函数(俗称回调地狱)
-
作用:解决异步回调
3.promise对象的3个状态:
-
pending:初始化状态
-
fullfilled:成功状态
-
rejected:失败状态
4.使用promise对象的基本步骤:
-
创建promise实例对象 -------> 初始化promise对象的状态为pending
-
执行异步任务:开启定时器,发送ajax请求
-
根据异步任务执行的结果去动态的修改promise对象的状态:resolve()成功,reject()失败
-
promise实例对象默认有个then方法,需要两个参数,这两个参数是两个回调函数
-
当promise对象的状态标为成功或失败的时候会自动调用then方法中的回调函数
5.promise对象创建后直接执行:
1 console.log("代码开始执行"); 2 3 setTimeout(() => { 4 console.log("执行定时器"); 5 },0); 6 7 let promise = new Promise((resolve,reject) =>{ 8 console.log("初始化promise状态"); 9 10 }); 11 12 console.log(promise); 13 14 console.log("代码执行结束");
从图中可以看出,promise对象创建后直接执行而其中可以定义异步方法。
6.promise中异步方法执行
promise中的异步方法只能同时设置resolve()或reject()中的一个,不能在一处同时设置两个。
执行后调用promise对象的then方法接收返回值
-
成功:then的第一个方法执行
-
失败:then的第二个方法执行
1 console.log("代码开始执行"); 2 3 setTimeout(() => { 4 console.log("执行定时器1"); 5 }, 0); 6 7 let promise = new Promise((resolve, reject) => { 8 console.log("初始化promise状态"); 9 setTimeout(() => { 10 resolve(); 11 console.log("resolve()执行"); 12 // reject(); 13 // console.log("reject()执行"); 14 }, 1000); 15 }); 16 17 console.log(promise); 18 19 console.log("代码执行结束"); 20 21 promise 22 .then(()=>{ 23 console.log("resolve()执行为成功"); 24 25 },()=>{ 26 console.log("reject()执行为失败"); 27 28 });
7.promise对象的then()方法
(1)then()方法可以连续连接在一起,如果第一个异步任务执行成功后可继续执行第二个异步任务。
1 let num = 0; 2 3 function util() { 4 num++; 5 let promise = new Promise((resolve, reject) => { 6 console.log("初始化promise状态"); 7 setTimeout(() => { 8 resolve(`第${num}个异步方法执行成功`); 9 console.log("resolve(msg)执行"); 10 // reject("第一个异步方法执行失败"); 11 // console.log("reject(msg)执行"); 12 }, 1000); 13 }); 14 15 return promise; 16 } 17 18 util() 19 .then((success) => { 20 console.log(success); 21 22 if (success) { 23 24 return util(); //第二个异步任务 25 } 26 27 }, (failure) => { 28 console.log(failure); 29 30 }) 31 .then((success) =>{ 32 console.log(success); 33 },(failure) =>{ 34 console.log(failure); 35 });
(2)如果第一个任务执行无论成功或失败后,第一个then()方法中没有内容再继续接一个then()则默认执行成功方法。
得出结论,promise.then()方法执行后返回promise默认调用成功执行方法。
1 let num = 0; 2 3 function util() { 4 num++; 5 let promise = new Promise((resolve, reject) => { 6 console.log("初始化promise状态"); 7 setTimeout(() => { 8 resolve(`第${num}个异步方法执行成功`); 9 console.log("resolve(msg)执行"); 10 // reject("第一个异步方法执行失败"); 11 // console.log("reject(msg)执行"); 12 }, 1000); 13 }); 14 15 return promise; 16 } 17 18 util() 19 .then((success) => { 20 console.log(success); 21 22 }, (failure) => { 23 console.log(failure); 24 25 }) 26 .then((success) =>{ 27 console.log(success); 28 console.log(`第2个异步方法执行成功`); 29 },(failure) =>{ 30 console.log(failure); 31 });
1 let num = 0; 2 3 function util() { 4 num++; 5 let promise = new Promise((resolve, reject) => { 6 console.log("初始化promise状态"); 7 setTimeout(() => { 8 // resolve(`第${num}个异步方法执行成功`); 9 // console.log("resolve(msg)执行"); 10 reject(`第${num}个异步方法执行失败`); 11 console.log("reject(msg)执行"); 12 }, 1000); 13 }); 14 15 return promise; 16 } 17 18 util() 19 .then((success) => { 20 console.log(success); 21 22 }, (failure) => { 23 console.log(failure); 24 25 }) 26 .then((success) =>{ 27 console.log(success); 28 console.log(`第2个异步方法执行成功`); 29 },(failure) =>{ 30 console.log(failure); 31 console.log(`第2个异步方法执行失败`); 32 });
1 let num = 0; 2 3 function util() { 4 num++; 5 let promise = new Promise((resolve, reject) => { 6 console.log("初始化promise状态"); 7 setTimeout(() => { 8 // resolve(`第${num}个异步方法执行成功`); 9 // console.log("resolve(msg)执行"); 10 reject(`第${num}个异步方法执行失败`); 11 console.log("reject(msg)执行"); 12 }, 1000); 13 }); 14 15 return promise; 16 } 17 18 util() 19 .then((success) => { 20 console.log(success); 21 22 }, (failure) => { 23 console.log(failure); 24 25 }) 26 .then((success) =>{ 27 console.log(success); 28 console.log(`第2个异步方法执行成功`); 29 },(failure) =>{ 30 console.log(failure); 31 console.log(`第2个异步方法执行失败`); 32 }) 33 .then((success) =>{ 34 console.log(success); 35 console.log(`第3个异步方法执行成功`); 36 },(failure) =>{ 37 console.log(failure); 38 console.log(`第3个异步方法执行失败`); 39 });
8.promise应用场景:在第一个异步任务成功后调用第二个异步任务执行(例如第一个定时器执行成功后调用第二个定时器执行)
执行过程分析: