Как обязательно обработать ошибку с помощью реагирующего запроса?

Поскольку этот ответный запрос в значительной степени основан на подходе декларативный, обработка ошибок, которую я вижу во всех примерах, выглядит примерно так:

function Todos() {
   const { isLoading, isError, data, error } = useQuery('todos', fetchTodoList)
 
   if (isLoading) {
     return <span>Loading...</span>
   }
 
   if (isError) {//If there is an error, render different JSX
     return <span>Error: {error.message}</span>
   } 
   
   return (
     <ul>
       {data.map(todo => (
         <li key = {todo.id}>{todo.title}</li>
       ))}
     </ul>
   )
 }

Но что, если я хочу просто показать предупреждение в случае ошибки? Или, возможно, я использую какой-то интерфейс обработки ошибок с императивным триггером? Что-то вроде этого:

if (isError) alert(`An error has occurred: ${error.message}`)

В этом случае я получаю два предупреждения. Что-то вызывает повторный рендеринг компонента, что, конечно же, приводит к «дублирующейся» обработке ошибок.

Почему это важно для меня? Потому что моя логика обработки ошибок может быть основана не на рендеринге какого-то конкретного JSX в моем компоненте, а на каком-то ручном одноразовом триггере. Предупреждение — это просто базовый пример.

Любые предложения будут с благодарностью!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пробовали использовать обратный вызов onError?

Это выглядит так:

    const useTodos = () =>
      useQuery(['todos'], fetchTodos, {
      // ⚠️ looks good, but is maybe _not_ what you want
      onError: (error) =>
        toast.error(`Something went wrong: ${error.message}`),
    })

Видите ли, обратный вызов onError для useQuery вызывается для каждого Observer, а это значит, что если вы дважды вызовете useTodos в своем приложении, вы получите два всплывающих сообщения об ошибках, даже если только один сетевой запрос завершится ошибкой.

Это работает, спасибо. Однако я должен спросить, какова цель этого пользовательского хука «useTodos»?

i.brod 20.03.2022 08:11

@i.brod да, это почти то же самое, что и вы, просто здесь, в примере, я написал, что это объект, который содержит некоторые переменные, реагирующий запрос обрабатывает кэширование фоновых обновлений и устаревшие данные из коробки с нулевой конфигурацией

Y_T 21.03.2022 06:49

Другие вопросы по теме