Promise扫盲

then

then函数能够return另外一个promise数组

const p1 = new Promise((resolve, reject) =>{
    resolve('p1')
})
const p2 = new Promise((resolve, reject) =>{
  setTimeout(() =>{
    resolve('p2')
  },3000)
})
p1.then(res => {
  console.log(res)
    return p2
}).then(res =>{  
    // p2 resolve后才执行
    console.log(res)
})
//p1
// 3s后输出...
// p2
复制代码

那么这个p2就会代替当前p1的状态,等到新的p2的状态修改时,下一个then才会执行promise

catch

1. 做用

能够捕获到promise程序执行中的error,等同于 .then(null, rejection).then(undefined, rejection)函数

2. 能够获取到的错误

  • promise函数体中抛出的errorpromise resolve后,再抛出错误,不会被捕获
    const p1 = new Promise((resolve,reject) => {throw new Error('error')})
    p1.catch(error => console.log(error))   // Error: error
    复制代码
  • promisereject操做
    const p2 = new Promise((resolve,reject) => reject('rejected'))
    p2.catch(error => console.log(error))  // rejected
    复制代码
  • then 函数体中抛出的error
    const p3 = new Promise((resolve,reject) => resolve('resolved'))
    p3.then(res =>{
        throw new Error('error')
    }).catch(error => console.log(error))  // Error: error
    复制代码
  • then函数能够返回一个promise(若是没有定义catch方法),若是这个promise函数体中有reject或者error,也能够捕获到

3. 推荐使用catch方式捕获错误,而不是then的第二个参数:

由于catch能够捕获到它前面全部then方法中的错误ui

finally

  • 无论promise最后状态如何,都会执行的操做
  • 没有参数,获取不到当前promise最后的状态

Promise.all

1. 参数

  • 参数不单单能够是数组,具备Iterator接口的对象均可以。
  • 数组参数的每个元素为promise实例,若是不是,就会调用Promise.resolve转换为Promise实例
    const obj = {
       [Symbol.iterator]() {
           let index = 0
           return {
               next() {
                   return {
                       // promise对象 和 其余类型均可以
                       value: new Promise(resolve => resolve(index++)), done: index > 2
                       // value: index++, done: index > 2
                   }
               }
           }
       }
    }
    const p = Promise.all(obj)
    p.then(res => {
       console.log(res)  // [0, 1]
    })  
    复制代码

2. 状态

const p = Promise.all([p1, p2, p3]);
复制代码

p的状态由p一、p二、p3决定,分红两种状况:spa

  • 只有p一、p二、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p一、p二、p3的返回值组成一个数组,传递给p的回调函数。
  • 只要p一、p二、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

3. catch

若是参数中的promise定义了catch方法,那么Promise.all()catch就不会捕获到错误code

Promise.race

  • 只要p一、p二、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。
  • 参数、catch规则同Promise.all

Promise.resolve

将现有对象转为Promise对象。对象

1. 参数

  • 参数为promise实例:原封不动的返回这个实例。
  • 参数为thenable对象:将它转为promise对象,而后当即执行它的then方法
  • 参数不是thenable对象,或者是一个原始值:返回一个新的promise对象,状态为resolved
  • 没有参数:直接返回衣蛾resolved状态的promise对象

Promise.reject

返回一个状态为rejectedpromise实例接口

Promise.reject()方法的参数,会原封不动地做为reject的理由,变成后续方法的参数回调函数

const thenable = {
  then(resolve, reject) {
    reject('error');
  }
};

Promise.reject(thenable)
.catch(e => {
  console.log(e === thenable)
})
// true e并非'error'
复制代码
相关文章
相关标签/搜索