Promise:
//创建一个Promise实例 // let p=new Promise((resolve,reject)=>{ // //一顿异步操作后 // //判断成功或失败后执行resolve或reject // if(false){ // // console.log("异步成功!"); // resolve("异步成功") // }else{ // // console.log("异步失败!"); // reject("异步失败!") // } // }); // p.then((value)=>{ //then可执行resolve回调函数 // console.log(value); // }).catch((reason)=>{ //catch可执行reject回调函数 // console.log(reason); // }) //把多层嵌套的回调函数给分离出来,通过 then 和 catch 来实现; // p.then((value)=>{ // console.log(value); // },(reject)=>{ // console.log(reject); // }) //catch()方法还可以作为 then 第二参数进行存在,方便多层回调 //-----------测试 let p1=new Promise((resolve,reject)=>{ //一顿异步操作后 //模拟异步1 setTimeout(()=>{ // console.log("异步1"); resolve("1.异步"); },3500); }); let p2=new Promise((resolve,reject)=>{ //一顿异步操作后 //模拟异步2 setTimeout(()=>{ // console.log("异步2"); resolve("2.异步"); },800); }); let p3=new Promise((resolve,reject)=>{ //一顿异步操作后 //模拟异步3 setTimeout(()=>{ // console.log("异步3"); resolve("3.异步"); },1500); }); //执行回调 p1.then((value)=>{ console.log(value); return p2; }).then((value)=>{ console.log(value); return p3; }).then((value)=>{ console.log(value); }) // //模拟异步1 // setTimeout(()=>{ // console.log("异步1"); // },3500); // //模拟异步2 // setTimeout(()=>{ // console.log("异步2"); // },500); // //模拟异步1 // setTimeout(()=>{ // console.log("异步3"); // },1500);
状态特点:
let p1=new Promise((resolve,reject)=>{ //一顿异步操作后 //模拟异步1 setTimeout(()=>{ // console.log("异步1"); resolve("1.异步"); },3500); }); let p2=new Promise((resolve,reject)=>{ //一顿异步操作后 //模拟异步2 setTimeout(()=>{ // console.log("异步2"); resolve("2.异步"); },800); }); let p3=new Promise((resolve,reject)=>{ //一顿异步操作后 //模拟异步3 setTimeout(()=>{ // console.log("异步3"); resolve("3.异步"); },1500); }); // console.log(p1);//Promise { <pending> } //执行回调 // p1.then((value)=>{ // console.log(value); // console.log(p1);//已完成 // return p2; // }).then((value)=>{ // console.log(value); // return p3; // }).then((value)=>{ // console.log(value); // }) ////p1,p2,p3 是三个 Promise 实例,数组元素顺序即输出顺序 let p=Promise.all([p1,p2,p3]); //将三个 Promise 实例的回调组合成数组输出 p.then(value=>{ console.log(value);//[ '1.异步', '2.异步', '3.异步' ] }) //虽然 p1,p2,p3 都是异步操作,但最终要等待所有异步完成,才可以输出; //只要 p1,p2,p3 中有一个出现了 Rejected,则会执行失败 //Promise 提供了一个 race()方法,只输出第一个改变状态的实例; ////p1,p2,p3 只要有一个改变状态,即回调 let p=Promise.race([p1,p2,p3]); p.then(value=>{ console.log(value);//2.异步 2的时间是0.8秒,时间最短,所以返回p2 }) //Promise 提供了 resolve()和 reject(),直接返回一个成功或失败的实例; let ps=Promise.resolve("成功"); let pj = Promise.reject('失败') console.log(ps);//Promise { '成功' } object类型 ps.then(value=>{ console.log(value);//成功 }).catch(reason=>{ console.log(reason); }) //等价于 new Promise(resolve => resolve('成功')); //类型一致性 function getP(){ if(true){ return new Promise(resolve=>{ resolve('成功'); }) }else{ // return 0;//如果是false 就会报错,需要类型一致,才不会报错 强制类型一致保证程序正确性 Promise.resolve(0) return Promise.resolve(0); } } getP().then(value=>{ console.log(value);//成功 }) // //模拟异步1 // setTimeout(()=>{ // console.log("异步1"); // },3500); // //模拟异步2 // setTimeout(()=>{ // console.log("异步2"); // },500); // //模拟异步1 // setTimeout(()=>{ // console.log("异步3"); // },1500);
浙公网安备 33010602011771号