2017-12-18 129 views
-1

我正在使用异步window.fetch呼叫,它返回一个承诺。为了解决这个问题,我把我的处理程序放在了这个承诺的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!") 
    } 
} 
+0

'赶上等待'应该是什么? –

+0

如果我没有错,你可以在.then()之后使用'.catch()'。 – Phiter

+3

我认为这是一个很好的问题,但您可能因为几个原因而陷入低报。 1)你问“什么是最好的”,所以人们会将此标记为基于意见。 2)你在问多个问题。你可以尝试改进措辞来避免这些事情。 –

回答

1

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

您应该在需要数据的地方处理错误,以便在出现故障的地方处理错误,更重要的是,您可以在何处处理错误。这意味着你应该通知用户有关错误或重试等等。 在您的情况下,错误处理程序会将所有错误消除并且无法真正处理它们,这使得使用Promise.catch变得不必要,因为承诺永远不会被拒绝。 所以你loadData函数不应该处理错误可言,但它传递到更高的水平范围:

​​

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

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

或者使用异步/ AWAIT:

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

什么是赶上()被拒绝的承诺之间的差别,在承诺,并在等待赶上?

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

+0

谢谢!我想知道这种'async'语法如何与所有这些不同的方法混为一谈! – Kokodoko