axios 如何在API调用失败之前重试几次?

brgchamk  于 2022-11-23  发布在  iOS
关注(0)|答案(1)|浏览(136)

我有一些代码如下。有没有简单的方法让它尝试端点3次,然后最终放弃并将其发送到catch块?最后一个代码块将是一个未经测试的尝试,但我想知道是否有更合适的方法来处理这个问题。
此文件与react移动的和web共享。我正在使用web端,不想更改此文件。

import { AxiosResponse } from 'axios';
import { HttpClient } from '../..';

export function postTeam({
  userId,
}: {
  userId: number;
}): Promise<AxiosResponse<TeamDetail>> {
  return HttpClient.post(
    `teams`,
    {
      user: {
        id: userId,
      },
    },
    {
      headers: {
        'content-type': 'application/json',
      },
    },
  );
}

还有一个文件,它像这样调用这个代码。这是我想做的更改,因为这只是在代码的Web端...

postTeam({
    userId: user.id,
})
.then(() => {
    //Do something
})
.catch((errors) => {
    console.log(errors);
    trackApiError(new Error(errors));
})
.finally(() => setIsSubmitting(false));

我的尝试:

for(let x = 0; x < 3; x++) {
  let success = false;
  postTeam({
    userId: user.id,
  })
    .then(() => {
      success = true;
    })
    .catch((errors) => {
      if(x >= 2) {
        console.log(errors);
        trackApiError(new Error(errors));
      }
    })
    .finally(() => {
      setIsSubmitting(false);
      success = true;
    })
    if(success) break;
}
bxgwgixi

bxgwgixi1#

我将稍微宽泛地回答这个问题,但仍然可以很容易地应用于您的情况。我将回答的是,当失败意味着抛出错误时,如何重试某个操作。

const maxTries = 3
let i = 0
do {
    try {
        // What you want to attempt. "await"ing if it returns a promise.
        break
    } catch { }
    ++i
} while (i < maxTries)

这是我个人可能会这样做,因为它意味着稍微少计算。我敢打赌,许多人会不同意我,虽然说优化是微不足道的,我会同意他们,所以这可能是一个简单的方法,可读性明智。

const maxTries = 3
for (let i = 0; i < maxTries; ++i)
    try {
        // What you want to attempt. "await"ing if it returns a promise.
        break
    }
    catch (e) { console.error(e) }

相关问题