2017-07-29 30 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));