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

时间:2017-12-18 13:53:54

标签: javascript asynchronous

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

async await的文档建议使用try catch来捕获错误。但Promise还有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!")
    }
}

1 个答案:

答案 0 :(得分:1)

  

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

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

then

现在您可以使用 loadData().then( /*success*/ (data) => console.log(data), /*failure*/ (err) => console.error(err) ); 处理错误:

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

或使用async / await:

catch
  

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

当承诺被拒绝时,它会调用传递给then的处理程序或{{1}}的第二个参数。