【问题标题】:fetch retry request (on failure)获取重试请求(失败时)
【发布时间】:2018-02-20 20:57:54
【问题描述】:

我正在使用浏览器的原生 fetch API 进行网络请求。我还在为不受支持的浏览器使用whatwg-fetch polyfill。

但是,如果请求失败,我需要重试。现在我找到了这个 npm 包whatwg-fetch-retry,但他们没有在他们的文档中解释如何使用它。有人可以帮我解决这个问题或建议我一个替代方案吗?

【问题讨论】:

标签: javascript fetch-api polyfills


【解决方案1】:

来自获取文档:

fetch('/users')
    .then(checkStatus)
    .then(parseJSON)
    .then(function(data) {
          console.log('succeeded', data)
    }).catch(function(error) {
          console.log('request failed', error)
    })

看到那个捕获了吗?提取失败时会触发,您可以在那里再次提取。 看看Promise API。

实现示例:

function wait(delay){
    return new Promise((resolve) => setTimeout(resolve, delay));
}

function fetchRetry(url, delay, tries, fetchOptions = {}) {
    function onError(err){
        triesLeft = tries - 1;
        if(!triesLeft){
            throw err;
        }
        return wait(delay).then(() => fetchRetry(url, delay, triesLeft, fetchOptions));
    }
    return fetch(url,fetchOptions).catch(onError);
}

编辑 1:as suggested by golopot,p-retry 是一个不错的选择。

编辑 2:简化的示例代码。

【讨论】:

  • 这正是我目前正在做的。但我正在寻找类似额外的可选 { retry: 3, //最大重试次数 retryTimeout: 3000 //连续请求之间的超时 }
  • 我刚刚用我认为应该是一个工作版本的版本更新了这个例子,你可能需要一些艰难的调整。告诉我你是否想在代码中添加一些 cmets 使其更清晰。
  • 感谢@BenjaminGruenbaum 指出代码非常混乱
【解决方案2】:

我建议使用一些库进行承诺重试,例如p-retry

例子:

const pRetry = require('p-retry')
const fetch = require('node-fetch')

async function fetchPage () {
  const response = await fetch('https://stackoverflow.com')

  // Abort retrying if the resource doesn't exist
  if (response.status === 404) {
    throw new pRetry.AbortError(response.statusText)
  }

  return response.blob()
}

;(async () => {
  console.log(await pRetry(fetchPage, {retries: 5}))
})()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2016-08-29
    • 1970-01-01
    • 2016-02-25
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多