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.

Llamada de función asíncrona repetida dentro de un componente de clase.

He creado una función asíncrona para llamar a una API de clima que devolverá la información solicitada enviada. La función funciona bien, sin embargo, cuando llamo a esta función dentro de un componente de clase, el resultado se devuelve dos veces. Esto no es exactamente un error grave, pero preferiría no tener dos llamadas a la API si no es necesario y me pregunto por qué se llama a este método dos veces en primer lugar.

Aquí está mi código.

async function submitQuery(props) {
  //En caso de que decida agregar parámetros adicionales como ciudad, país, etc., he decidido colocar la propiedad zip en un objeto para poder simplemente
  //añade propiedades adicionales en el objeto de envío
  const submission = {
    zip: props,
  };

  if (!Number(props)) return console.log("esto no es un número");

  const { error } = await validate(submission);
  if (error) return console.log(error.message);

  const config = {
    method: "get",
    url: `https://api.openweathermap.org/data/2.5/weather?zip=${props}&appid=${apiKey}`,
    headers: {},
  };

  /*
  const query = await axios(config).then(function (response) {
    const result = response.data.main;
    return result;
  });
  */

  //console.log(query);
  return 4;
}

class WeatherReport extends React.Component {
  getResults = async () => {
    const result = await submitQuery("08060");
    console.log(result);
  };

  render() {
    return (
      <div classname="reportContainer">
        <weathercard getresults="{this.getResults}"></weathercard>
      </div>
    );
  }
}

const WeatherCard = ({ getResults }) => {
  getResults();
  return <div></div>;
};
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que se está haciendo la llamada a la API dos veces porque la función submitQuery se está llamando tanto en la función getResults como en el componente WeatherCard. En el componente WeatherCard, la función getResults se llama inmediatamente cuando se renderiza el componente. Esto provoca que la llamada a la API se haga antes de que el componente esté completamente montado, lo que a su vez hace que la función submitQuery se llame de nuevo en la función getResults.

    Para solucionar este problema, solo debe llamar a la función getResults cuando realmente sea necesaria, como respuesta a una interacción del usuario o después de que el componente esté completamente montado. Podría mover la función getResults al componente WeatherReport y pasarla al componente WeatherCard como una propiedad. Luego, puede llamar a la función getResults en respuesta a una interacción del usuario en el componente WeatherCard.

    Otra opción sería llamar a la función submitQuery en el método del ciclo de vida componentDidMount del componente WeatherReport, lo que aseguraría que la llamada a la API se haga solo después de que el componente esté completamente montado.

Comments are closed.