Maybaygiare.org

Blog Network

長いPromiseチェーンにおけるエラー処理

Promisesのタオ

Promisesとその使用を支配するモナド則についてもう少し経験と理解があれば、このコードのリファクタリングにあまり時間を費やすことはなかったでしょう。JavaScriptでは、非同期コードは、JavaScriptの継続モナドであるPromiseを介して処理できます。 この場合、Promiseがモナドであることについて最も重要なことは、次の法則が真であることです。

Promise.resolve(Promise.resolve(x)) === Promise.resolve(x).

上記のものよりも重要ですが、これは:上記のこの魔法のルールは、一日の終わりに私にいくつかの思考力を救ったものです。

Promise.resolve(Promise.reject(x)) === Promise.reject(Promise.resolve(x)) === Promise.reject(x).

上記の魔法のルールは、私にいくつかの思考力 これは、私がそれらのエラーが起こったとすぐに、彼ら自身の機能の中で、その長い鎖の狂気から離れて扱うことができることを意味しました。 答えはいつも私を見つめていた、私はそれを見ることができませんでした。 今私は見る、そしてそれは美しいです。div>

今、それは良い、本当の約束です
今、それは良い、本当の約束です

これは、私は単にこのようなsaveapplication関数を持つことができることを意味しました。

function saveApplication() {
return makeApiCall().catch((err) => Promise.reject('basic'));
}

the。catchブロックは、saveApplication呼び出しがbasicと呼ばれるフォームのステップに関連しているため、フォームの基本ステップでエラーを処理していることを意味します。 これは、下のコードの美しい部分に私たちを導きました:

saveApplication()
.then(uploadImages)
.then(saveService)
.then(savePricingInfo)
.then(savePaymentInfo)
.then(gotoMainPage)
.catch((step) => {
setErrorState();
multiStepManager.go(step);
});

私たちは、約束チェーンの単一行を変更しなければならなかった今、内部のすべての機能こと。次に、blocksは対応するステップに既に拒否されているPromiseを返します。しかし、内部キャッチによって処理されなかった他のタイプのエラーが発生した場合はどうなりますか?まあ、それは簡単にカスタムエラータイプを実装し、私たちのメイン内の異なるエラータイプの評価を分離することによって解決することができます。キャッチブロック。 このように:

function saveApplication() {
return makeApiCall().catch((err) => Promise.reject(new StepError('basic')));
}//
saveApplication()
.then(uploadImages)
.then(saveService)
.then(savePricingInfo)
.then(savePaymentInfo)
.then(gotoMainPage)
.catch((step) => {
if(err instanceof StepError) {
setErrorState();
multiStepManager.go(step);
}
else {
// handle other types of errors
}
});

この場合、メイン。catchブロックはStepError型のエラーのみを処理します。 他のタイプのエラーは、アプリケーションまたはブラウザによってそれに応じて処理できるように、拒否されずに単純にスローされます。

異なるHTTPステータスなどの特定のエラータイプを処理するために、同じ原則を拡張することができ、拡張する必要があります。

コメントを残す

メールアドレスが公開されることはありません。