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.

Usar datos antiguos de Settimout.

Tengo una matriz de mensajes de un bot y un usuario. Primero, se activa la función “add Bot Message”, donde se agrega primero un mensaje del usuario y luego del bot después de 2 segundos.

Cuál es el problema:
El mensaje del usuario (la función “addUserMessage”) funciona bien, pero después de 2 segundos agrega un mensaje del bot, pero al mismo tiempo elimina el mensaje del usuario.

Entiendo que setTimeout utiliza los datos antiguos de la matriz de mensajes y sobrescribe el mensaje del usuario.

¿Cómo solucionarlo? Gracias

const [messages, addMessages]=useState([]);

const addBotMessage = async (value, callback) => {
  addUserMessage(value, callback);
  setTimeout(() => {
    addMessages([...messages, {content: BotContent[callback], time: getTime(), author: 'bot'}]);
  }, 2000);
}

const addUserMessage = (value, callback) => {
  if (!value) return;
  addMessages([...messages, {content: value, time: getTime(), author: 'user'}]);
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el problema, puedes utilizar el parámetro prevState de la función addMessages dentro del callback de setTimeout para obtener el último estado del array de mensajes. Esto asegurará que el mensaje del bot se agregue después del mensaje del usuario sin sobrescribirlo. Reescribe la función addBotMessage de la siguiente manera:

    const addBotMessage = async (value, callback) => {
      addUserMessage(value, callback);
      setTimeout(() => {
        addMessages(prevState => [...prevState, { content: BotContent[callback], time: getTime(), author: 'bot' }]);
      }, 2000);
    };
    

    Al utilizar el parámetro prevState, nos aseguramos de que siempre estamos actualizando el último estado del array de mensajes.

Comments are closed.