2017-12-18 138 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