モジュール 7 · レッスン 4 / 4コース内の 28/32~12 min
モジュールのレッスン (4/4)
非同期コードのエラー
非同期操作は同期操作とは異なり失敗します。エラーはすぐには発生しません。 それは「後で」、Promise が 拒否 状態になるときに到着します。 2 つの主要なツールを見てみましょう。
try/catch と await
失敗した Promise の前に await を置くと、エラーは再スローされます。
通常の例外: try/catch でキャッチします。
JS
async function safeRead() {
try {
const r = await fetch('/api/cose');
if (!r.ok) throw new Error('HTTP ' + r.status);
return await r.json();
} catch (err) {
console.error('network error:', err.message);
return null;
}
}これは最も読みやすいパターンです。「ハッピー パス」を直線的に記述し、すべてを 1 つのブロックで処理します。
.catch の約束
連鎖スタイルの場合:
JS
fetch('/api/cose')
.then((r) => r.json())
.then((data) => console.log(data))
.catch((err) => console.error(err));.catch は、前のチェーンに沿ってスローされたあらゆるエラーを捕捉します。
Promise.all は最初の拒否で失敗します
JS
const ps = [Promise.resolve(1), Promise.reject(new Error('no')), Promise.resolve(3)];
try {
const r = await Promise.all(ps);
} catch (err) {
console.log(err.message); // 'no'
}他の Promise はバックグラウンドで実行され続けますが、Promise.all は最初のエラーで「解決」します。
すべての結果 (失敗を含む) が必要な場合は、Promise.allSettled を使用します。
JS
const outcomes = await Promise.allSettled(ps);
// [{ status: 'fulfilled', value: 1 },
// { status: 'rejected', reason: Error('no') },
// { status: 'fulfilled', value: 3 }]試してみてください
運動#js.m7.l4.e1
試行回数: 0読み込み中…
`readOrFallback(p, fallback)` を非同期に定義します。Promise p を待ってみます。拒否された場合はフォールバックを返します。
エディターを読み込み中…
ヒントを表示
try { return await p; } catch { フォールバックを返します。 }
3 回の試行後に解決策が利用可能になります
復習演習
運動#js.m7.l4.e2
試行回数: 0読み込み中…
`allOrNothing(promises)` を非同期に定義します。Promise.all を使用します。少なくとも 1 つが失敗した場合は、空の配列 [] を返します。それ以外の場合は値を返します。
エディターを読み込み中…
ヒントを表示
try { return await Promise.all(promises);キャッチ { 戻り値 []; }
3 回の試行後に解決策が利用可能になります