promise的常用API和常用属性

  • Promise构造函数:new Promise((resolve, reject)=>{ }),resolve()表示成功,接下来执行promise实例的then方法中的第一个函数;reject表示失败,执行promise实例的then方法中的第二个函数或者catch。

  • .then方法:有两个参数,第一个是promise的状态从等待状态变为成功状态之后执行的函数;第二个参数是promise的状态从等待状态变为失败状态之后执行的函数。会返回一个新的promise对象。

  • .catch方法:有一个参数,promise执行发生异常时,会执行.catch中的代码,效果相当于.then方法中的第二个参数。区别就是:在.then的第一个函数参数中的执行代码发生了异常,.then的第二个函数参数是捕获不到的,但是.catch中能捕获到;若.then中的第二个参数和.catch都存在,出现错误后捕获时会采取就近原则,即如果promise内部报错,reject抛出错误或者throw new Error()后,会在.then中的第二个参数中捕获到,.catch中捕获不到。

    示例如下:

    const promise = new Promise((resolve, rejected) => {
        throw new Error('test');
    });
    
    //此时只有then的第二个参数可以捕获到错误信息
    // Error: test..1
    promise.then(res => {
        //
    }, err => {
        console.log(err + "..1");
    }).catch(err1 => {
        console.log(err1 + "..2");
    });
    
    
    //此时catch方法可以捕获到错误信息
    // Error: test..2
    promise.then(res => {
        //
    }).catch(err1 => {
        console.log(err1 + "..2");
    });
    
    
    //此时只有then的第二个参数可以捕获到Promise内部抛出的错误信息
    // Error: test..1
    promise.then(res => {
        throw new Error('hello');
    }, err => {
        console.log(err + "..1");
    }).catch(err1 => {
        console.log(err1 + "..2");
    });
    
    //此时只有then的第二个参数可以捕获到Promise内部抛出的错误信息
    // Error: test..1
    promise.then(res => {
        throw new Error('hello');
    }, err => {
        console.log(err + "..1");
    });
    
    
    //此时catch可以捕获到Promise内部抛出的错误信息
    // Error: test..2
    promise.then(res => {
        throw new Error('hello');
    }).catch(err1 => {
        console.log(err1 + "..2");
    });
    
    // 从以上例子可看出,若promise内部抛出错误,同时.then中的第一个参数也抛出错误,.then的第二个参数和.catch中都只能捕获到promise内部的错误,即promise内部抛出错误的优先级大于.then的第一个参数中抛出的错误
    
    const promise = new Promise((resolve, rejected) => {
        resolve('test');
    });
    
    //此时只有catch中可以捕获到.then第一个参数中抛出的错误信息
    // Error: hello..2
    promise.then(res => {
        throw new Error('hello');
    }, err => {
        console.log(err + "..1");
    }).catch(err1 => {
        console.log(err1 + "..2");
    });
    
    //此时then的第二个参数不能捕获到.then第一个参数中抛出的错误信息
    // 没有输出内容,promise实例会返回一个reject
    promise.then(res => {
        throw new Error('hello');
    }, err => {
        console.log(err + "..1");
    });
    
    
    //此时catch可以捕获到.then第一个参数中抛出的错误信息
    // Error: hello..2
    promise.then(res => {
        throw new Error('hello');
    }).catch(err1 => {
        console.log(err1 + "..2");
    });
    
    // 从以上例子可看出,若promise内部没有抛出错误,而在.then中的第一个参数抛出错误,.then的第二个参数是捕获不到这个错误的,只有.catch中能捕获到。
    
  • resolve():返回一个成功的promise对象。

  • reject():返回一个失败的promise对象。

  • all():参数是一个数组,数组元素都是promise的实例,只有当数组中的promise实例都返回成功后,才会执行.then中的第一个函数参数,只要有一个失败,就会执行.then中的第二个函数参数或者.catch中的代码。用法如下:

    let a = new Promise((resolve, reject) => {
      resolve('成功了')
    })
    
    let b = new Promise((resolve, reject) => {
      resolve('success')
    })
    
    let c = Promse.reject('失败')
    
    Promise.all([a, b, c]).then((arr)=>{}).catch((e)=>{})
    
  • race():参数和all()一样,也是一个数组,数组元素是promise的实例,用法也与all()一致,不同的是,它的结果取决于参数中先执行完的promise返回的结果,如果第一个执行完的promise实例返回结果是成功,那么race()就返回成功;如果第一个执行完的promise实例返回结果是失败,那么race()就返回失败。

    注:
    	1、.then和.catch是Promise实例的方法;resolve、reject、all、race都是Promise的方法
    	2、.catch就是then()的语法糖,实质上还是执行的promise的then方法,即,.catch((e)=>{})相当于.then(undefined, (e)=>{})
    
posted @ 2021-05-10 21:35  Upward123  阅读(615)  评论(0编辑  收藏  举报