传统实现异步操作就是采用回调函数,回调函数方式本身没有什么问题,但是在多重回调函数层层嵌套的情况下,那么代码的可阅读性就会出现问题。
Promise对象 是一个新的异步操作解决方案,比原有的回调函数等方式更为合理
Promise对象 具有三种状态:Pending(等待)、Resolved(已完成) 和 Rejected(未完成)
Promise对象状态的改变只有两种可能: Pending转变为Resolved或者Pending转变为Rejected
step1().then(step2).then(step3).then(step4).catch(function(err){ // do somethingn when err }) let param; //传递参数载体 function p1() { return new Promise(function(resolve,reject){ setTimeout(function() { console.log("aaaaaa"); // resolve(123); param = "第1"; reject(123) },3000); }); } function p2() { return new Promise(function(resolve,reject){ setTimeout(function(){ console.log("bbbbbb"); param = "第2"; resolve(456); // 继续向下 // reject(456); // 截停 },2000); }); } function p3() { return new Promise(function(resolve,reject){ setTimeout(function () { console.log("cccccc"); console.log('传来:' + param); param = '第3'; resolve(789); },1000); }); } function p4() { return new Promise(function(resolve,reject) { setTimeout(function () { console.log("dddddd"); console.log('传来:' + param); resolve("结束"); },1000); }); } p1().then(p2).then(p3) .then(function(data){ console.log("data: " + data); }) .catch(function(error){ console.log('end,error:' + error); if(error == 123){ // 如果第1步出错 p3().then(p4); }else if(error == 456) { p4(); } });
实例:
function studyEs6() { let param; // 定义一个变量,用于步骤之间传值 // 定义4个步骤 function p1() { return new Promise(function(resolve,reject) { // resolve完成状态(成功) reject未完成状态(失败) setTimeout(function() { console.log("aaaaaa"); param = '我是123'; // resolve(123); // 必须加上resolve, p2才会执行,resolve中可以传值,也可以不传值 reject(123); },3000) }) } function p2() { return new Promise(function(resolve,reject) { setTimeout(function() { console.log("bbbbbb"); resolve(456); },2000) }) } function p3() { return new Promise(function(resolve,reject) { setTimeout(function() { console.log("cccccc"); console.log('收到:' + param); // 获取p1传来的值 -- 我是123 param = '我是789'; // 重新赋值 resolve(789); },1000) }) } function p4() { return new Promise(function(resolve,reject) { // 最后一步可以不写resolve和reject setTimeout(function() { console.log("dddddd"); console.log('我收到:' + param); // 获取p3传来的值 -- 我是789 },500) }) } p1().then(p2).then(p3).then(function(data){ // .then(function(data))中接收到的值是最后一个函数传的值,此处为 p3 console.log('收到参数:' + data); // 789 }).catch(function(err){ // 捕获reject状态下情况,err为reject()传递的值 console.log('出错:' + err); if(err == 123){ // 判断如果p1出错,则从p3开始向下执行 p3().then(p4); } }); }