es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Consulta de React: cancelar solicitudes pendientes o anteriores.

Estoy intentando cancelar cualquier solicitud previa / pendiente si está tardando demasiado y el usuario navega a otro componente. Actualmente, la consulta toma un valor de estado y, cuando cambia, el componente lo vuelve a renderizar, lo cual está bien y es el comportamiento deseado. Sin embargo, al mirar en la pestaña de red, las solicitudes aún están pendientes. ¿Existe alguna manera en React Query de cancelar cualquier solicitud anterior? He intentado hacer la cancelación de la consulta según la documentación, pero no es correcto ya que no se está cancelando.

const [value, setValue] = React.useState(false);

const getData = async (value: number): Promise => {
const CancelToken = axios.CancelToken
const source = CancelToken.source()
const response = await axios.get(`https://xxxxxx?value=${value}`, {
cancelToken: source.token,
}).then(res => res.data);
if (CancelToken) {
response.cancel = () => {
source.cancel(‘La consulta fue cancelada por React Query’)
}
}
return response;
}

const { data: result, status, error, isFetching }: any = useQuery([‘getData’, value], () => getData(value),
{
refetchOnWindowFocus: false,
}
);

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Puede utilizar el gancho useQuery de React Query para cancelar cualquier solicitud anterior. El gancho useQuery toma un CancelToken de la biblioteca axios, que le permite cancelar cualquier solicitud pendiente.

    Puede utilizar la opción refetchOnWindowFocus para establecer la consulta para que no se actualice cuando se enfoca la ventana. También puede utilizar la propiedad status del gancho useQuery para comprobar si la consulta se está cargando, y si lo está, puede llamar al método cancel en el objeto result para cancelar la consulta.

    Aquí hay un ejemplo de cómo puede utilizar el gancho useQuery para cancelar cualquier solicitud pendiente:

    “`js
    const [value, setValue] = React.useState(false);

    const getData = async (value: number): Promise => {
    const CancelToken = axios.CancelToken
    const source = CancelToken.source()
    const response = await axios.get(`https://xxxxxx?value=${value}`, {
    cancelToken: source.token,
    }).then(res => res.data);
    if (CancelToken) {
    response.cancel = () => {
    source.cancel(‘La consulta fue cancelada por React Query’)
    }
    }
    return response;
    }

    const { data: result, status, error, isFetching }: any = useQuery([‘getData’, value], () => getData(value),
    {
    refetchOnWindowFocus: false,
    }
    );

    React.useEffect(() => {
    if (status === ‘loading’) {
    result.cancel();
    }
    }, [status]);
    “`

Comments are closed.