Операторы выписки бланкета, которые просто повторяют один и тот же вызов, могут быть опасными, если они используются как общий механизм обработки исключений. Сказав это, вот обертка повторных попыток на основе лямбда, которую вы можете использовать любым способом. Я выбрал фактор количества повторений и тайм-аут повтора в качестве параметров для большей гибкости:
public static class Retry
{
public static void Do(
Action action,
TimeSpan retryInterval,
int maxAttemptCount = 3)
{
Do<object>(() =>
{
action();
return null;
}, retryInterval, maxAttemptCount);
}
public static T Do<T>(
Func<T> action,
TimeSpan retryInterval,
int maxAttemptCount = 3)
{
var exceptions = new List<Exception>();
for (int attempted = 0; attempted < maxAttemptCount; attempted++)
{
try
{
if (attempted > 0)
{
Thread.Sleep(retryInterval);
}
return action();
}
catch (Exception ex)
{
exceptions.Add(ex);
}
}
throw new AggregateException(exceptions);
}
}
Теперь вы можете использовать этот метод утилиты для выполнения логики повтора:
Retry.Do(() => SomeFunctionThatCanFail(), TimeSpan.FromSeconds(1));
или:
Retry.Do(SomeFunctionThatCanFail, TimeSpan.FromSeconds(1));
или:
int result = Retry.Do(SomeFunctionWhichReturnsInt, TimeSpan.FromSeconds(1), 4);
Или вы даже можете сделать перегрузку async
.
В соответствии с документацией Обработка побочных эффектов , вы можете передать обратный вызов мета-атрибуту для получения полезной нагрузки ответа:
export const uploadByBase64 = ({ file, path }) => ({
type: UPLOAD_BY_BASE64,
payload: { file, path },
meta: {
fetch: CREATE,
resource: 'images/upload/base64',
callback: ({ payload, requestPayload }) => {
// payload = response payload
},
},
});