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

 

posted @ 2018-09-29 15:52  cher。  阅读(142)  评论(0编辑  收藏  举报