Promise使用
Promise可以进行异步操作,比起回调函数,更加容易维护。
首先创建一个简单的Promise
var p = new Promise( () => {}); console.log(p); //会打印一个promise对象,状态是pending,状态值是undefined
如果Promise构造函数里没有参数将会报错
promise有三个状态,分别是pending,resolved和rejected。
var p = new Promise((res,rej) => { //里面有俩个参数,是俩个函数,一个表示成功的,一个表示失败的 res(200); }) console.log(p); //打印promise对象,状态是成功,状态值是200
promise任务链
var p = new Promise((res,rej) => { res() }); //promise链式,可以一直then,如果有一次状态为失败,就会执行catch p.then(() => { console.log(1); }).then(() => { //then本身是返回一个promise,也可以自己return一个新的promise实例 return new Promise((res,rej) => { rej(100); }) }).then(() => { console.log(3) }).catch((data) => { console.log(data);
)};
打印的是1和100,p拥有一个then方法,并且他还会返回一个promise,可以进行链式操作,如果中途有个rejected状态,就会执行catch,并且后面的不在执行
执行顺序
console.log(1); setTimeout(() => { console.log(2); }) setTimeout(()=> { console.log(3); }) var p = new Promise((res,rej) => { console.log(4); res(); }) p.then(()=>{ console.log(5) }) console.log(6);
打印的顺序是1,4,6,5,2,3
js从上到下执行,第一个打印1,后面有俩个定时器,还有直接打印的和promise,定时器有延迟执行,会放到队列里,promise创建的时候回里面执行参数里面的代码,就会打印4
然后打印6,之后会打印5,最后会打印队列里的俩个定时器2,3
宏任务 : 主体js,setTimeout(setTimeout里面的函数是异步的),setInterval;
微任务 : Promise后面的then和catch,process.nextTick
promise的静态方法
var p1 = new Promise((res,rej) => { setTimeout(() => { res('1'); },1000) }) var p2 = new Promise((res,rej) => { setTimeout(() => { res('2'); },2000) }) var p3 = new Promise((res,rej) => { setTimeout(() => { res('3') },500) }) var p4 = Promise.all([p1,p2,p3]); p4.then((data) => { console.log(data); //['1','2','3'] }) console.log(p4); //打印一个promise对象
Promise.all()他可以让参数里面的所有promise最后同时进行
并且还有rece方法,他会执行里面最快的一个promise