在Javascript中等待函数时捕获错误的正确方法

在Javascript中等待函数时捕获错误的正确方法,javascript,promise,try-catch,settimeout,es6-promise,Javascript,Promise,Try Catch,Settimeout,Es6 Promise,在我的函数中我不能捕捉到拒绝。我在谷歌搜索过,但还没有找到解决方案,所以请帮我编写以下代码: async function errorFunc(){ setTimeout(() => { return Promise.reject("Any error occured!"); }, 1000); } async function main(){ await errorFunc().catch((error)=>{

在我的函数中我不能捕捉到拒绝。我在谷歌搜索过,但还没有找到解决方案,所以请帮我编写以下代码:

async function errorFunc(){
    setTimeout(() => {
        return Promise.reject("Any error occured!");
    }, 1000);
}
async function main(){
    await errorFunc().catch((error)=>{
        console.log("E in catch:", error);
    });
    
    try{
        await errorFunc();
    }catch(e){
        console.log("E in try-catch:", e);
    }
}

main();
主函数中的catch没有一个起作用……在控制台中,仅打印两次此错误消息:

毫无疑问,任何错误都会发生

我想抓住那个错误,或者最好说拒绝承诺。在我的主要功能中如何实现这一点

谢谢

异步函数errorFunc{ 返回新PromiseSolve,reject=>setTimeout=>rejectAny error!发生错误,1000 } 这就是你想要的


回调将在全局中执行,没有人捕获它。

我认为它打印了两次相同的错误,因为在第二个函数中:

try{
        await errorFunc();
    }catch(e){
        console.log("E in try-catch:", error);
    }
}

你打印了错误,但抓住了e,我不太理解这个问题,但我想这就是它打印两次的原因


可能用e交换错误以打印捕获的其他错误

您必须从函数返回承诺

async function errorFunc(){
   return new Promise((resolve,reject)=>{
   setTimeout(() => {
      return reject("Any error occured!");
   }, 1000);
  })
}

async function main(){
   await errorFunc().catch((error)=>{
      console.log("E in catch:", error);
   });

   try{
      await errorFunc();
   }catch(e){
      console.log("E in try-catch:", e);
   }
}

您的errorFunc没有返回您拒绝的承诺,因此无法捕获它。类似的东西应该可以返回新的PromiseSolve,reject=>setTimeout=>reject'Any error Occessed!',1000;你是对的,现在它起作用了。但是——有没有办法不回报承诺?为什么我不想退货?因为它是另一个使代码可读性降低的包装器。。。我认为当我将函数声明为async时,它自动意味着它是Promise。。。所以我可以简单地称之为承诺。在它里面拒绝,它的行为就像正常的承诺一样……有没有办法做到我想要的?使用Promise.reject而不返回承诺。是的,async使其返回承诺。但如果您不在该函数中的任何地方使用wait,那么在这种情况下,该承诺将立即得到满足。无论你在超时时间做什么,都与承诺无关。如果您想在超时时保留一个句柄,则需要显式返回自制的承诺,这样您就可以解决它或拒绝它。此+如中所述王仁宏'你是对的,我有错误,我应该打印e,而不是错误,但这不是我要寻找的…我希望这有帮助,至于另一个问题,我没有提到它,因为我不知道答案,但我认为我应该提到它,因为你说它打印了两次
async function errorFunc(){
   return new Promise((resolve,reject)=>{
   setTimeout(() => {
      return reject("Any error occured!");
   }, 1000);
  })
}

async function main(){
   await errorFunc().catch((error)=>{
      console.log("E in catch:", error);
   });

   try{
      await errorFunc();
   }catch(e){
      console.log("E in try-catch:", e);
   }
}