settimeout 使用旧数据

Settimout use old data

我有一组来自机器人和用户的消息消息。首先,触发添加Bot Message 功能,首先添加来自用户的消息,然后在2 秒后添加来自bot 的消息。

问题是什么: 来自用户的消息(addUserMessage 函数)工作正常,但 2 秒后它添加了来自机器人的消息,但同时删除了用户的消息。

我了解到setTimeout使用消息数组的旧数据并重写了来自用户的消息

如何解决?谢谢

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'}]);
}

试试这个:

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

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

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

如果唯一的原因是在这些消息之间有一些延迟,我会用另一种方式来做:

addUserMessage(value, callback);
await new Promise(resolve => setTimeout(resolve, 2000));
addMessages([...messages,{content:BotContent[callback], time:getTime(), author:'bot'}]);

这样你就可以在正确的当前状态下延迟添加第二个命令。