2017-09-25 16 views
0

応答のHTTPコードに基づいて失敗した場合(たとえば:not 200)、フェッチ要求に何らかの再試行システムを持たせたいとします。それは次のようになります。再帰的フェッチ要求を作成する方法はありますか?

fetch('someURLWithAJSONfile/file.json') 
     .then(function (res) { 
      console.log(res.status); 
      if (res.status !== 200) { 
       console.log("There was an error processing your fetch request. We are trying again."); 

// Recursive call to same fetch request until succeeds 

      } else { 
       return res.json(); 
      } 
     }).then(function (json) { 
     data = json; 
    }).catch(function (err) { 
     console.log(`There was a problem with the fetch operation: ${err.message}`); 
    }); 

約束カスタム内部の要求を取得し、そのHTTP応答のステータスを確認した後、自分自身を呼び出す作る置く方法はありますか?

+0

あります。それは単なる約束であり、それらは連鎖して入れ子にすることができます。あなたの試みのコードを教えてください。 – Bergi

+0

'data = json;'は[何ができません](https://stackoverflow.com/q/23667086/1048572)です。 – Bergi

答えて

1

これを行うには、fetchによって作成された約束を返す名前付き関数で呼び出しを呼び出すことができます。考えてみましょう:

function fetchWithRetry(url, retryLimit, retryCount) { 
    retryLimit = retryLimit || Number.MAX_VALUE; 
    retryCount = Math.max(retryCount || 0, 0); 
    return fetch(url).then(function (res) { 
     console.log(res.status); 
     if (res.status !== 200 && retryCount < retryLimit) { 
      console.log("There was an error processing your fetch request. We are trying again."); 
      return fetchWithRetry(url, retryLimit, retryCount + 1); 
     } else { 
      return res.json(); 
     } 
    }); 
} 

fetchWithRetry('someURLWithAJSONfile/file.json', 10).then(function (json) { 
    data = json; 
}).catch(function (err) { 
    console.log(`There was a problem with the fetch operation: ${err.message}`); 
}); 

このコードは、既存の呼び出しをラップし、両方のオプションである再試行の制限や回数を維持するために、クロージャのスコープを利用しています。前回のfetch呼び出しと同じように、URLを使用してfetchWithRetry関数を呼び出します。再試行制限に合格しないと、無限に続行されます。最終的なretryCount変数は、実際には再帰目的でのみ使用され、内部的に呼び出されることを意図しています。

1

ここでは、簡単なES6ソリューション(fetchを使用しているため)です。 limitオプションは、リクエストを何回試してみるかを意味します。

var doRecursiveRequest = (url, limit = Number.MAX_VALUE) => 
    fetch(url).then(res => { 
    if (res.status !== 200 && --limit) { 
     return doRecursiveRequest(url, limit); 
    } 
    return res.json(); 
    }); 

doRecursiveRequest('someURLWithAJSONfile/file.json', 10) 
    .then(data => console.log(data)) 
    .catch(error => console.log(error)); 
関連する問題