我在将以下代码块重构为单独的函数时遇到麻烦。
socketHandler = (io) => {
io.on('connection', (socket) => {
socket.on('doLogin', data => {
userService.getUserByName(data.uname)
.then((doc) =>{
if(doc && doc.pwd===data.pwd){
socket.emit('onLogin', {status:'SUCCESS'});
}
}, (error) => {
socket.emit('onLogin', {status:'Error in the application'});
});
});
});
}
app.configure(socketio(socketHandler));
我尝试按如下方式重构上面的代码。
doLogin = data => {
userService.getUserByName(data.uname)
.then((doc) =>{
if(doc && doc.pwd===data.pwd){
socket.emit('onLogin', {status:'SUCCESS'});
}
}, (error) => {
socket.emit('onLogin', {status:'Error in the application'});
});
}
socketHandler = (io) => {
io.on('connection', (socket) => {
socket.on('doLogin', doLogin);
});
}
app.configure(socketio(socketHandler));
我收到运行时错误,因为未定义套接字。
如何在函数"doLogin"中获取对"套接字"的引用?
我也尝试了以下方法,但无法使其工作。
doLogin = socket => data => {
还尝试如下
socket.on('doLogin', doLogin.bind(socket));
需要一些帮助来解决这个问题。
谢谢。
分解函数后,您失去了对socket
对象的引用。你可以试试,在套接字处理程序
socket.on('doLogin', (data) => doLogin(data, socket));
并将doLogin
重新定义为
doLogin = (data, socket) => {
如果doLogin
是箭头函数,则doLogin.bind(socket)
不起作用,因为箭头函数无法绑定。相反,它应该是一个常规函数:
function doLogin(data) {
const socket = this;
...
}
...
socket.on('doLogin', doLogin.bind(socket));