Promise的使用

80 阅读2分钟

Promise的使用

Promise解决的问题:回调地狱,promise是回调的一种解决方案 Promise的状态:fulfilledrejectedpedding

优点:Promise解决了回调地狱的问题,避免函数嵌套,使得代码难以理解。 缺点:Promise的状态一旦发生变化,就不能在改变。

Promise接收一个函数作为参数,里面有两个参数,分别是resolvereject,前者可以将pedding状态变为fulfilled,并将结果传递出去,当调用.then的成功回调可以获得结果,后者可以将fulfilled状态变成pedding,当调用.then或.catch的失败回调可以获取失败的结果。

const p = new Promise((resolve,reject)=>{
      resolve(200)
})
p.then(res=>{console.log(res)})
//打印出 200

当p为fulfilled状态时,调用.then且不指定成功回调时,程序并不会报错如下:

const p = new Promise((resolve,reject)=>{
     resolve(200)
})
p.then(undefined)
//程序不会报错

当p的状态为fulfilled时,不指定失败的回调时,程序会抛出异常

const p = new Promise((resolve,reject)=>{
    reject(200)
})
p.then(res=>{
  console.log(res)
})
//Uncaught (in promise) 200

Promise.resolve()

用于返回一个状态为fulfilledrejected的实例,如果其参数是一个状态rejected的Promise实例,那么将返回rejected,其它情况都是fulfilled

Promise.resolve(100).then(res=>{
     console.log(res)  //输出100
})

传递一个状态为fulfilled实例

Promise.resolve(Promise.resolve(100)).then(res=>{
   console.log(res)  //100
})

如果传递的是一个状态为rejected的Promise实例,那么将调用失败的回调

Promise.resolve(Promise.reject(100)).then(res=>{
    console.log(res)
},err=>{
   console.log('error',err)  //error 100
})

Promise.reject()

用于返回一个状态为rejected的Promise实例,那么一定调用失败的回调函数

Promise.reject(100).catch(res=>{
   console.log(res)          //100
})

Promise.reject(Promise.resolve(100)).catch(res=>{
   console.log(res)          //100
})

Promise.reject(Promise.reject(100)).catch(res=>{
   console.log(res)          //100
})

promise.all()

传入一个数组,数组中包含所有Promise实例,当所有的实例的状态都是fulfilled的时候,那么将调用成功的回调并返回一个所有成功结果的数组。如果其中一个为rejected那么将返回失败的结果,不是一个数组

const p = Promise.resolve()
const p1 = Promise.resolve(200)
const x = Promise.all([p,p1])
x.then(res=>{
  console.log(res)     // [undefined,200]
})
        const p = Promise.resolve()
        const p2 = new Promise((resolve,reject)=>{
            setTimeout(() => {
                reject(100) 
            }, 200);   
        })
        const p1 = new Promise((resolve,reject)=>{
            setTimeout(() => {
                reject(150) 
            }, 100);
            
        })
        const x = Promise.all([p,p2,p1])
        x.then(res=>{
            console.log(res)
        },error=>{
            console.log(error)   //150
        })

Promise.race

const p = Promise.race([p1, p2, p3]);

只要p1p2p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。

如何改变Promise的状态?

resolve()

reject()

抛异常(状态为pedding变为reject)

         new Promise((resolve,reject)=>{
            throw new Error(111)
        }).catch(err=>{
            console.log(err)
        })