该问题是由您的客户端代码引起的。每次您致电reply()
您在客户端中设置了一个额外的函数socket.on('Ans', ...)
事件处理程序这意味着它们会累积。你可以将其更改为socket.once()
每次获得后它都会自行删除Ans
信息。然后您还可以删除您的flag
多变的。
function reply() {
socket.emit('Quest' , Quest);
audio.play();
// change this to .once()
socket.once('Ans', function(replyFromBot) {
console.log("hi");
var para = document.createElement("p2");
x = document.getElementById("MiddleBox");
para.appendChild(document.createTextNode(replyFromBot));
x.appendChild(para);
x.scrollTop = x.scrollHeight;
});
}
Socket.io 并不是真正构建为请求/响应系统的,而这正是您尝试使用的系统。实现这一点的更好方法是使用acksocket.io 具有的功能这样您就可以得到直接回复Quest
您发送的消息。
您还需要修复共享变量replyFromBot
and listen
在您的服务器上,因为一旦有多个用户使用您的服务器,这些并发问题就会发生。
更好的解决方案
更好的解决方案是使用ack
socket.io 必须能够直接响应您发送的消息。为此,您需要将服务器更改为:
function newConnection(socket) {
console.log(socket.id);
socket.on('Quest', function(data, fn) {
let replyFromBot = bot.reply("local-user", data);
console.log(socket.id+ " "+replyFromBot);
// send ack response
fn(replyFromBot);
});
}
并且,将您的客户端代码更改为:
function reply() {
audio.play();
socket.emit('Quest', Quest, function(replyFromBot) {
console.log("hi");
var para = document.createElement("p2");
x = document.getElementById("MiddleBox");
para.appendChild(document.createTextNode(replyFromBot));
x.appendChild(para);
x.scrollTop = x.scrollHeight;
});
}
通过这种方式,您可以连接到消息的直接回复,因此它作为请求/响应的工作方式比您以前的方式要好得多。