使用箭头函数重构嵌套函数



我在将以下代码块重构为单独的函数时遇到麻烦。

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));

最新更新