ホームページ  >  記事  >  ウェブフロントエンド  >  非同期操作を処理するための必須の Promise Retry 設計パターンとは何ですか?

非同期操作を処理するための必須の Promise Retry 設計パターンとは何ですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-22 17:59:03736ブラウズ

What Are the Essential Promise Retry Design Patterns for Handling Asynchronous Operations?

Promise Retry Designs

Promise により非同期プログラミングが可能になり、非同期操作を処理するための柔軟で効率的なメカニズムが提供されます。ただし、Promise で再試行が必要なシナリオを処理するパターンを設計する必要がある場合があります。ここでは、3 つの異なる Promise 再試行設計パターンを紹介します。

  1. Promise が解決するまで再試行 (Delay と MaxRetries を使用)
<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>
  1. 結果の条件まで再試行 (遅延と MaxRetries あり)
<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);
        });
    })</code>
  1. メモリ効率の高い動的再試行 (無制限の再試行あり)

通常の .then() チェーンの代わりに .catch() チェーンを構築することに基づいた代替アプローチを検討します。

<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>

このパターンは、制限された数のシナリオに適しています。メモリ消費の問題を回避するために、再試行と低い最大数を設定します。

  1. 結果が条件を満たすまで (遅延なしで) 再試行します
<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>
  1. 結果が条件を満たすまで再試行します (遅延あり)
<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);
    // Don't simplify this to `p.catch(attempt).then(test, rejectDelay)` as test failures won't be caught.
}
p = p.then(processResult).catch(errorHandler);</code>

以上が非同期操作を処理するための必須の Promise Retry 設計パターンとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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