如何使用中止控制器设置超时并在 ES7 异步等待功能中重试

How to set timeout with abort controller and retry in ES7 async await function

我正在尝试获取请求,如果请求花费的时间比指定的超时时间长,那么我将使用中止控制器中止它,或者如果响应出现错误(如套接字挂起),则尝试以递归方式再次获取它。我想重复它,即 5 次,最后如果失败则 return 只是错误。但是在我的代码中,第一次尝试后它立即失败并显示获取请求已中止。 这是我的代码。 提前谢谢你。

const getData = async () => {
  let url = `https://www.example.com`
  let options = {
    method: 'POST',
    agent: proxyagent,
    signal: signal,
    body: JSON.stringify({
      username: 'abc'
    })
  }
  const fetchData = async (retries) => {
    try {
      let timer = setTimeout(() => controller.abort(), 1000)
      let response = await fetch(url, options)
      clearTimeout(timer)
      if (response.ok) return response.json()
    } catch (e) {
      console.log(e)
      if (retries === 1 || retries < 1) {
        return {
          message: 'Something went wrong'
        }
      }
      return await fetchData(retries - 1)
    }
  }
  return await fetchData(5)
}

您不能重复使用中止的信号。您必须为每个 fetch

创建一个新的
const getData = async () => {
  let url = `https://www.example.com`;
  let controller;
  let options = {
    method: 'POST',
    agent: proxyagent,
    body: JSON.stringify({
      username: 'abc'
    })
  }
  const fetchData = async (retries) => {
    controller = new AbortController();
    const optionsWithSignal = {
      ...options,
      signal: controller.signal
    };

    try {
      let timer = setTimeout(() => controller.abort(), 1000)
      let response = await fetch(url, optionsWithSignal)
      clearTimeout(timer);
      if (response.ok) return response.json()
    } catch (e) {
      console.log(e)
      if (retries === 1 || retries < 1) {
        return {
          message: 'Something went wrong'
        }
      }
      return await fetchData(retries - 1)
    }
  }
  return await fetchData(5)
}