2017-12-01 8 views
3

だから、私はAPIのチェーンを持っているが、私は実行する必要があることを呼び出して、このgracefull fallback async/await chainの1つの約束がうまくいかない?

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

data2data3のようなものは関係ない、まだこのように1つの関数内で行う必要があり。つまり、これらの要求のいずれかが失敗した場合、アプリケーションは部分的にエラーが発生しますが、それでも他のデータが表示される可能性があります。現在、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ブロックを削除しなくなりますラッパー関数を作成することです
関連する問題