Javascript 允诺捕获中的回缩错误

Javascript 允诺捕获中的回缩错误,javascript,promise,Javascript,Promise,我在教程中找到了以下代码: promise.then(function(result){ //some code }).catch(function(error) { throw(error); }); 我有点困惑:这个电话能完成什么吗?在我看来,它没有任何效果,因为它只是抛出与捕获到的错误相同的错误。我是基于一个常规的try/catch是如何工作的。所以听起来你的问题是,“在承诺链中,.catch()方法做什么?” throw语句“将停止(throw之后的语句将不被执行),

我在教程中找到了以下代码:

promise.then(function(result){
    //some code
}).catch(function(error) {
    throw(error);
});

我有点困惑:这个电话能完成什么吗?在我看来,它没有任何效果,因为它只是抛出与捕获到的错误相同的错误。我是基于一个常规的try/catch是如何工作的。

所以听起来你的问题是,“在承诺链中,
.catch()
方法做什么?”

throw语句“将停止(throw之后的语句将不被执行),控制权将传递给调用堆栈中的第一个catch块。如果调用函数之间不存在catch块,程序将终止。”


在promise链中,
.then()
方法将返回某种类型的数据块。块的返回将完成承诺。数据的成功返回完成了承诺。您可以用同样的方法来考虑
.catch()
方法<但是,code>.catch()将处理不成功的数据检索。throw语句完成了承诺。偶尔,您会看到开发人员使用
.catch((err)=>{console.log(err))}
,这也将完成承诺链。

如果您完全忽略
catch
方法调用,则没有重要区别

它唯一增加的是一个额外的微任务,这在实践中意味着您将在没有
catch
子句的情况下发现拒绝承诺的情况

下一个代码片段演示了这一点:

var-p;
//案例1:有陷阱
p=承诺。拒绝(“我的错误1”)
.catch(函数(错误){
抛出(错误);
});
p、 catch(error=>console.log(error));
//案例2:无捕获
p=承诺。拒绝(“我的错误2”);

p、 catch(error=>console.log(error))如你所示,赤裸裸地抓并扔是没有意义的。除了添加代码和降低执行速度之外,它没有做任何有用的事情。因此,如果您要
.catch()
并重新播放,那么在
.catch()
中应该有您想要做的事情,否则您应该完全删除
.catch()

一般结构的常见点是,当您希望执行
.catch()
中的某些内容时,例如记录错误或清除某些状态(如关闭文件),但希望承诺链继续被拒绝

promise.then(function(result){
    //some code
}).catch(function(error) {
    // log and rethrow 
    console.log(error);
    throw error;
});
在教程中,它可能只是向人们展示在哪里可以捕捉错误,或者教授处理错误的概念,然后重新播放错误


捕获和重新捕获的一些有用原因如下:

  • 您希望记录错误,但将承诺链保留为已拒绝
  • 您希望将错误转换为其他错误(通常是为了更容易在链的末尾处理错误)。在本例中,您将重新显示一个不同的错误
  • 您希望在承诺链继续之前进行一系列处理(例如关闭/释放资源),但希望承诺链继续被拒绝
  • 如果出现故障,您需要在承诺链的这一点上为调试器放置一个断点
  • 您希望处理一个特定错误或一组错误,但重新播放其他错误,以便它们传播回调用者
  • 但是,在catch处理程序中没有其他代码的情况下对同一错误进行简单的捕获和重试对代码的正常运行没有任何帮助。

    这两个
    .then()
    .catch()
    方法都会返回承诺,如果您在任一处理程序中抛出异常,返回的承诺被拒绝,异常将在下一个拒绝处理程序中捕获

    在下面的代码中,我们在第一个
    .catch()
    中抛出一个异常,在第二个
    .catch()
    中捕获该异常:

    新承诺((解决、拒绝)=>{
    console.log('Initial');
    解决();
    })
    .然后(()=>{
    抛出新错误('某个失败');
    console.log('Do this');//从未到达
    })
    .catch(()=>{
    log('Something failed');
    抛出新错误(“再次出现故障”);
    })
    .catch((错误)=>{
    console.log('Final error:',error.message);
    
    }); > p>实际上您不需要重新抛出它,只留下约定。catch空,否则它将被视为un-Unter拒绝,然后将代码包在一个TIG catch中,它将自动地捕获正在通过的错误。

    try{
      promise.then(function(result){
        //some code
      }).catch(function(error) {
        //no need for re throwing or any coding. but leave this as this otherwise it will consider as un handled
      });
    }catch(e){
      console.log(e);
      //error can handle in here
    }
    

    在承诺链中,最好使用

    函数f2中的ex:。然后(…).catch(e=>reject(e))

    • test1-使用try-catch
    • test2-不带try或.catch
    • test3-with.catch
    函数f1(){
    返回新承诺((解决、拒绝)=>{
    抛出新错误(“测试”);
    });
    }
    函数f2(){
    返回新承诺((解决、拒绝)=>{
    f1()。然后(值=>{
    console.log('f1正常吗?');
    }).捕获(e=>拒绝(e));
    });
    }
    函数test1(){
    log('test1-with-try-catch-look in F12');
    试一试{
    f2()。然后(()=>{//Uncaught(承诺中)错误:test
    console.log('???');});
    }捕获(e){
    log('此错误未被捕获');
    }
    }
    函数test2(){
    log('test2-不带try或.catch-在F12中查找');
    f2();//未捕获(承诺中)错误:测试
    }
    函数test3(){
    log('test3-with.catch');
    f2()。然后(值=>{
    console.log(“??”);
    }).catch(e=>{
    log('now it ok,error',e);
    })
    }
    setTimeout(()=>{test1();
    setTimeout(()=>{test2();
    setTimeout(()=>{test3();
    }, 100);
    }, 100);
    
    }, 100);