Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用中止控制器设置超时,并在ES7异步等待函数中重试_Node.js_Recursion_Async Await_Fetch_Settimeout - Fatal编程技术网

Node.js 如何使用中止控制器设置超时,并在ES7异步等待函数中重试

Node.js 如何使用中止控制器设置超时,并在ES7异步等待函数中重试,node.js,recursion,async-await,fetch,settimeout,Node.js,Recursion,Async Await,Fetch,Settimeout,我正在尝试获取请求,如果请求花费的时间超过指定的超时时间,那么我将使用abort controller中止请求,或者如果响应中出现错误(如套接字挂起),则再次尝试递归获取请求。我想重复它,即5次,最后如果失败,然后返回错误。但在我的代码中,在第一次尝试后,它立即失败,并显示提取请求已中止。 这是我的密码。 先谢谢你 const getData = async () => { let url = `https://www.example.com` let options = {

我正在尝试获取请求,如果请求花费的时间超过指定的超时时间,那么我将使用abort controller中止请求,或者如果响应中出现错误(如套接字挂起),则再次尝试递归获取请求。我想重复它,即5次,最后如果失败,然后返回错误。但在我的代码中,在第一次尝试后,它立即失败,并显示提取请求已中止。 这是我的密码。 先谢谢你

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)
}
const getData=async()=>{
让url=`https://www.example.com`
让选项={
方法:“POST”,
代理:代理,
信号:信号,,
正文:JSON.stringify({
用户名:“abc”
})
}
const fetchData=async(重试)=>{
试一试{
let timer=setTimeout(()=>controller.abort(),1000)
let response=等待获取(url、选项)
清除超时(计时器)
if(response.ok)返回response.json()
}捕获(e){
控制台日志(e)
如果(重试次数===1 | |重试次数<1){
返回{
信息:“出了点问题”
}
}
返回等待获取数据(重试次数-1)
}
}
返回等待获取数据(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)
}
const getData=async()=>{
让url=`https://www.example.com`;
let控制器;
让选项={
方法:“POST”,
代理:代理,
正文:JSON.stringify({
用户名:“abc”
})
}
const fetchData=async(重试)=>{
控制器=新的中止控制器();
常量选项带信号={
…选项,
信号:控制器。信号
};
试一试{
let timer=setTimeout(()=>controller.abort(),1000)
let response=wait fetch(url,选项带信号)
清除超时(计时器);
if(response.ok)返回response.json()
}捕获(e){
控制台日志(e)
如果(重试次数===1 | |重试次数<1){
返回{
信息:“出了点问题”
}
}
返回等待获取数据(重试次数-1)
}
}
返回等待获取数据(5)
}