You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何点击按钮时弹窗次数逐次递增?socket.io技术问题咨询

问题分析与解决

问题现象

项目基于socket.io实现服务端与客户端通信,点击按钮时客户端向服务端发送数据,服务端返回反馈;当反馈值为1时,页面弹出alert提示。但出现异常:首次点击弹窗1次,第二次点击弹窗2次,第三次点击弹窗3次,以此类推。

问题原因

客户端代码中,每次调用log函数(即每次点击按钮)时,都会重复绑定Existing-user事件的监听回调。随着点击次数增加,该事件的监听函数会不断累积,导致服务端返回反馈时,所有已绑定的回调都会被触发,弹窗次数也就随之递增。

客户端原代码

function log(names, proto) {
    socket.emit('log',
        JSON.stringify({
            msg: names,
            proto: proto
        })
    )
    socket.on('Existing-user',(e)=>{
        console.log('!')
        if(e===0){
            $("login").hide()
            $("content").show()
        }else{
            alert("The username is repeated, please change it.")
        }
    })
}

服务端代码

socket.on('log', function (e) {
    let loginfo = JSON.parse(e);
    if(userlist.includes(loginfo.msg)){
        socket.emit('Existing-user',1)
        console.log('!')
    }else{
        userlist.push(loginfo.msg)
        socket.emit('Existing-user',0)
    }
    console.log(userlist)
})

解决方案

将Existing-user事件的监听代码移到log函数外部,确保只绑定一次,避免每次点击按钮时重复绑定。修改后的客户端代码如下:

// 初始化阶段仅绑定一次事件监听
socket.on('Existing-user',(e)=>{
    console.log('!')
    if(e===0){
        $("login").hide()
        $("content").show()
    }else{
        alert("The username is repeated, please change it.")
    }
})

function log(names, proto) {
    socket.emit('log',
        JSON.stringify({
            msg: names,
            proto: proto
        })
    )
}

说明

服务端代码逻辑无问题,无需修改。调整客户端代码后,每次点击按钮仅发送请求,Existing-user事件的监听函数始终只有一个,服务端返回反馈时只会触发一次回调,弹窗次数即可恢复正常。

内容的提问来源于stack exchange,提问作者yoga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:30:45