2017-07-29 31 views
0

我在将以下代码块重构为单独的函数时遇到了问题。使用箭头函数重构嵌套函数

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

需要一些帮助解决这个。

谢谢。

回答

2

当你分手后,你失去了对socket对象的引用。你可以试试,在的SocketHandler

socket.on('doLogin', (data) => doLogin(data, socket)); 

,并重新定义doLogin作为

doLogin = (data, socket) => { 
0

doLogin.bind(socket)如果doLogin是箭头的功能,将无法工作,因为箭头功能无法约束。相反,它应该是一个常规功能:

function doLogin(data) { 
    const socket = this; 
    ... 
} 
... 
socket.on('doLogin', doLogin.bind(socket));