美文网首页
对Promise中的resolve,reject,catch理解

对Promise中的resolve,reject,catch理解

作者: cain07 | 来源:发表于2022-01-28 21:35 被阅读0次

    resolve,reject简单理解
    我们先构建一个Promise

    //构建Promise
    var promise = new Promise(function (resolve, reject) {
        if (/* 异步操作成功 */) {
            resolve(data);
        } else {
            /* 异步操作失败 */
            reject(error);
        }
    });
    

    类似构建对象,使用new来构建一个Promise。Promise接受一个「函数」作为参数,该函数的两个参数分别是resolve和reject。这两个函数就是就是「回调函数」,由JavaScript引擎提供。

    Promise实例生成以后,可以用then方法指定resolved状态和reject状态的回调函数。

    //promise.then(onFulfilled, onRejected);
    
    promise.then(function(data) {
      // do something when success
    }, function(error) {
      // do something when failure
    });
    

    then方法会返回一个Promise。它有两个参数,分别为Promise从pending变为fulfilled和rejected时的回调函数(第二个参数非必选)。这两个函数都接受Promise对象传出的值作为参数。

    .catch()
    该方法是.then(undefined, onRejected)的别名,用于指定发生错误时的回调函数。

    promise.then(function(data) {
        console.log('success');
    }).catch(function(error) {
        console.log('error', error);
    });
    
    /*******等同于*******/
    promise.then(function(data) {
        console.log('success');
    }).then(undefined, function(error) {
        console.log('error', error);
    });
    

    promise对象的错误,会一直向后传递,直到被捕获。即错误总会被下一个catch所捕获。then方法指定的回调函数,若抛出错误,也会被下一个catch捕获。catch中也能抛错,则需要后面的catch来捕获。

    sendRequest('test.html').then(function(data1) {
        //do something
    }).then(function (data2) {
        //do something
    }).catch(function (error) {
        //处理前面三个Promise产生的错误
    });
    promise一旦resolve了再抛错,也不会变为rejected,就不会被catch了。
    
    var promise = new Promise(function(resolve, reject) {
      resolve();
      throw 'error';
    });
    
    promise.catch(function(e) {
       console.log(e);      //This is never called
    });
    

    如果没有使用catch方法指定处理错误的回调函数,Promise对象抛出的错误不会传递到外层代码,即不会有任何反应

    关于promise中reject和catch的问题

    一、reject后的东西,一定会进入then中的第二个回调,如果then中没有写第二个回调,则进入catch

    var p1=new Promise((resolve,rej) => {
        console.log('没有resolve')
        //throw new Error('手动返回错误')
        rej('失败了')
    
     })
     p1.then(data =>{
        console.log('data::',data);
     },err=> {
        console.log('err::',err)
     }).catch(
        res => {
        console.log('catch data::', res)
     })
    

    结果:

    没有resolve
    err:: 失败了
    

    then中没有第二个回调的情况

    var p1=new Promise((resolve,rej) => {
        console.log('没有resolve')
        //throw new Error('手动返回错误')
        rej('失败了')
    
     })
     p1.then(data =>{
        console.log('data::',data);
     }).catch(
        res => {
        console.log('catch data::', res)
     })
    

    结果:

    没有resolve
    catch data:: 失败了
    

    二、resolve的东西,一定会进入then的第一个回调,肯定不会进入catch

    var p1=new Promise((resolve,rej) => {
        console.log('resolve')
        //throw new Error('手动返回错误')
        resolve('成功了')
    
     })
    
     p1.then(data =>{
        console.log('data::',data);
     }).catch(
        res => {
        console.log('catch data::', res)
     })
    

    结果:

    resolve
    data:: 成功了
    

    不会进入catch的情况,只要resolve了,就算抛出err,也不会进入catch

     var p1=new Promise((resolve,rej) => {
        console.log('resolve')
        //throw new Error('手动返回错误')
        resolve('成功了')
    
     })
    
     p1.catch(
        res => {
        console.log('catch data::', res)
     })
    

    结果:

    resolve
    

    throw new Error 的情况和rej一样,但是他俩只会有一个发生
    另外,网络异常(比如断网),会直接进入catch而不会进入then的第二个回调

    相关文章

      网友评论

          本文标题:对Promise中的resolve,reject,catch理解

          本文链接:https://www.haomeiwen.com/subject/glntkrtx.html