有没有办法做出递归获取请求?

时间:2017-09-25 15:35:39

标签: javascript node.js express ecmascript-6 fetch

我希望我的获取请求具有某种重试系统,如果它根据响应的HTTP代码失败(例如:不是200)。它看起来像这样:

ClearableFileInput

有没有办法将获取请求放在自定义Promise中,并在检查其http响应状态后让它自己调用?

2 个答案:

答案 0 :(得分:2)

这里是简单的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));

答案 1 :(得分:1)

您可以通过将对fetch的调用包装在一个返回fetch创建的promise的命名函数中来实现。考虑:

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}`);
});

此代码包装您的现有调用,并利用闭包范围来维护重试限制和计数,这两者都是可选的。然后,您使用URL调用fetchWithRetry函数,就像您之前调用fetch一样。如果您没有通过重试限制,它将无休止地继续。最终的retryCount变量实际上只用于递归目的,并且意味着在内部调用。