2017-12-01 11 views
3

그래서, 나는 API의 사슬 내가이 경우, 수행이gracefull fallback async/await chain에서 하나의 약속이 실패하는 곳?

const myBigCall = async (paramsObj) => { 
    try { 
    const data1 = await myCall1(paramsObj.first); 
    const data2 = await myCall2(paramsObj.second); 
    const data3 = await myCall3(paramsObj.third); 
    } catch e { console.error(e) } 
} 

같은 것을 필요로 호출있어 data1, data2, data3는 관련이없는, 아직이 같은 일 함수 내에서 수행해야 . 즉, 이러한 요청 중 하나가 실패하면 응용 프로그램이 부분적으로 오류가 발생하지만 다른 데이터가 계속 표시 될 수 있습니다. 현재 data1 또는 data2이 실패한 경우 data3이 호출되지 않습니다. 그것을 호출하는 방법은 없지만 여전히 오류를 잡을 수 있습니까?

답변

3

통화가 관련이없는 경우 모든 통화가 차단되므로 기다리지 않아야합니다. 적어도 Promise.all을 사용하여 동시에 전화를해야합니다.

const myBigCall = async (paramsObj) => { 
    try { 
    const dataArray = await Promise.all([ 
     myCall1(paramsObj.first), 
     myCall2(paramsObj.second), 
     myCall3(paramsObj.third) 
    ]); 
    } catch e { console.error(e) } 
}; 

그러나 약속 중 하나라도 실패하면 여전히 실패합니다.

const dontFail = promise => promise.catch(() => null); 

const myBigCall = async (paramsObj) => { 
    const dataArray = await Promise.all([ 
     myCall1(paramsObj.first), 
     myCall2(paramsObj.second), 
     myCall3(paramsObj.third) 
    ].map(dontFail)); 

} 
: 그것에서 얻을 수있는 쉬운 방법은 실패와 실패의 경우 null 또는 undefined을 반환하고 전체 try 블록을 제거 방지하는 래퍼 함수를 ​​작성하는 것입니다