调用异步函数时在哪里添加错误处理?

问题描述 投票:-1回答:1

我正在使用异步window.fetch调用,它返回一个promise。为了解决结果,我把我的处理程序放在了承诺的then()部分。

async await的文档建议使用try catch来捕捉错误。但承诺有一个rejectcatch()功能......

我不清楚这三个中的哪一个我必须使用来从fetch调用中捕获失败的加载尝试。我也没有看到被拒绝的Promise与fetch(url).then().catch()捕获的失败抓取之间的区别。

我唯一的要求是fetch调用是在我自己的函数内部,我可以从任何地方调用。

// CALLING THE LOADDATA FUNCTION
loadData().then(res => {
         console.log("success")
      }, err => {
         console.log("rejected!")
      }).catch(e => {
         console.log("error is " + e);
      })

// ASYNC LOADDATA
async function loadData() {
    try{
        const response = await fetch('./data.json');
        return await response.json();
    } 
    catch(e) {
        console.log("nope!")
    }
}
javascript asynchronous
1个回答
1
投票

捕获错误的最佳点是什么?

您应该在需要数据的地方处理错误,以便发生故障,更重要的是您可以真正处理它的地方。这意味着您应该告知用户有关错误或重试或其他任何事情。在您的情况下,错误处理程序会使所有错误无法解决,并且无法真正处理它们,这使得使用Promise.catch不必要,因为承诺永远不会被拒绝。所以你的loadData函数根本不应该处理错误,而是将它传递给更高级别的范围:

 async function loadData(){ 
   return (await fetch('./data.json')).json();
 }

现在您可以使用then处理错误:

 loadData().then(
  /*success*/ (data) => console.log(data),
  /*failure*/ (err) => console.error(err)
 );

或者使用async / await:

 (async function(){
    try {
      console.log( await loadData() );
    } catch(e){
      console.error(e);
   }
})()

被拒绝的承诺,承诺中的catch()和等待中的catch有什么区别?

当promise被拒绝时,它会调用传递给catch的处理程序或then的第二个参数。

© www.soinside.com 2019 - 2024. All rights reserved.