ホームページ  >  記事  >  ウェブフロントエンド  >  一時的なエラー処理のための Promise Retry デザイン パターンを実装するにはどうすればよいですか?

一時的なエラー処理のための Promise Retry デザイン パターンを実装するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-22 22:57:29479ブラウズ

How to Implement Promise Retry Design Patterns for Transient Error Handling?

Promise Retry Design Patterns

はじめに

非同期操作が失敗した場合、再試行は一時的なエラーを処理する効果的な戦略となる可能性があります。この記事では、Promise ベースの操作を再試行するためのさまざまなパターンを、3 つの一般的なシナリオに焦点を当てて説明します。

パターン #1: Promise が解決するまで再試行

このパターンでは、Promise が継続的に再試行されます。正常に解決されるまで。再試行間の遅延と最大試行回数を指定します。

<code class="javascript">Promise.retry = function(fn, times, delay) {
    return new Promise(function(resolve, reject){
        var error;
        var attempt = function() {
            if (times == 0) {
                reject(error);
            } else {
                fn().then(resolve)
                    .catch(function(e){
                        times--;
                        error = e;
                        setTimeout(function(){attempt()}, delay);
                    });
            }
        };
        attempt();
    });
};</code>

パターン #2: 条件が満たされるまで再試行

このパターンは、条件が満たされるまで再試行します。約束の結果について。再試行間の遅延と最大試行回数を指定します。

<code class="javascript">work.publish()
    .then(function(result){
        return new Promise(function(resolve, reject){
            var intervalId = setInterval(function(){
                work.requestStatus(result).then(function(result2){
                    switch(result2.status) {
                        case "progress": break; //do nothing
                        case "success": clearInterval(intervalId); resolve(result2); break;
                        case "failure": clearInterval(intervalId); reject(result2); break;
                    }
                }).catch(function(error){clearInterval(intervalId); reject(error)});
            }, 1000);
        });
    })
    .then(function(){console.log('done')})
    .catch(console.error);</code>

パターン #3: 条件付き無制限の再試行

このパターンは、メモリ効率の高い方法を提供します。無制限に再試行します。再試行間の遅延のみを指定します。

.catch() チェーンを使用した代替アプローチ

上記のパターンとは異なり、このアプローチは .catch() チェーンを構築します。 .then() チェーン。試行回数を制限し、過剰なメモリ消費を避けるために最大値が低いシナリオに適しています。

<code class="javascript">function rejectDelay(reason) {
    return new Promise(function(resolve, reject) {
        setTimeout(reject.bind(null, reason), t); 
    });
}</code>

解決するまで遅延して再試行します

<code class="javascript">var max = 5;
var p = Promise.reject();

for(var i=0; i<max; i++) {
    p = p.catch(attempt).catch(rejectDelay);
}

p = p.then(processResult).catch(errorHandler);</code>

条件が満たされるまで、遅延なしで再試行します

<code class="javascript">var max = 5;
var p = Promise.reject();

for(var i=0; i<max; i++) {
    p = p.catch(attempt).then(test);
}

p = p.then(processResult).catch(errorHandler);</code>

条件が満たされるまで、遅延ありで再試行します

<code class="javascript">var max = 5;
var p = Promise.reject();

for(var i=0; i<max; i++) {
    p = p.catch(attempt).then(test).catch(rejectDelay);
}

p = p.then(processResult).catch(errorHandler);</code>

結論

これらのパターンは、非同期操作の再試行ロジックを実装するための多彩な方法を提供します。 .catch() チェーンと .then() チェーンのどちらを使用するかは、メモリ使用量や最大試行回数などの要件によって異なります。

以上が一時的なエラー処理のための Promise Retry デザイン パターンを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。