2017-12-18 7 views
-1

약속을 반환하는 비동기 window.fetch 호출을 사용하고 있습니다. 결과를 해결하기 위해 나는 그 약속의 일부인 then()에 내 처리기를 넣었다.비동기 함수를 호출 할 때 오류 처리를 추가 할 위치는 어디입니까?

async await에 대한 문서는 오류를 잡으려고 try catch을 사용하는 것이 좋습니다. 그러나 약속은 reject 및뿐만 아니라 catch() 기능 ... 그것은 나에게 분명하지 않다

을 가지고 내가 fetch 호출에서 실패한 로딩 시도를 잡기 위해 사용해야하는이 세 가지있다. 또한 거부 된 약속과 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

'catch in await' 그게 뭐야? –

+0

내가 잘못하지 않았다면'.then()'다음에'.catch()'를 사용할 수 있습니다. – Phiter

+3

나는 이것이 좋은 질문이라고 생각하지만, 아마도 두 가지 이유로 downvoted을 얻고있을 것이다. 1) 당신은 "무엇이 최고인가"를 묻습니다. 그래서 사람들은 이것을 근거로 의견을 표합니다. 2) 여러 가지 질문을하고 있습니다. 이런 일들을 피하기 위해 말씨를 약간 수정 해보십시오. –

답변

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) 
); 

또는 비동기/await를 사용하여 : 거부 된 약속의 차이, 캐치()는의 새로운 기능

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

약속, 그리고 잡기를 기다리고 있습니까?

약속이 거부

, 그것은 catch에 전달 핸들러 또는 then의 두 번째 매개 변수를 호출합니다.

+0

고마워요! 나는이 '비동기식'문법이 이러한 모든 다른 접근법으로 어떻게 엉망이되는지 궁금하다. – Kokodoko