Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用箭头函数重构嵌套函数_Javascript_Ecmascript 6_Refactoring - Fatal编程技术网

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

Javascript 使用箭头函数重构嵌套函数,javascript,ecmascript-6,refactoring,Javascript,Ecmascript 6,Refactoring,我很难将下面的代码块重构成单独的函数 socketHandler = (io) => { io.on('connection', (socket) => { socket.on('doLogin', data => { userService.getUserByName(data.uname) .then((doc) =>{ if(doc && doc.pwd===data.pwd){

我很难将下面的代码块重构成单独的函数

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”中获取对“socket”的引用

我也尝试了下面的方法,但没有成功

doLogin = socket => data => {
也尝试如下

socket.on('doLogin', doLogin.bind(socket));
需要一些帮助来解决这个问题


谢谢。

在您中断函数后,您丢失了对
socket
对象的引用。你可以试试,在索克德勒

socket.on('doLogin', (data) => doLogin(data, socket));
并将
doLogin
重新定义为

doLogin = (data, socket) => {

分解函数后,您失去了对
socket
对象的引用。你可以试试,在索克德勒

socket.on('doLogin', (data) => doLogin(data, socket));
并将
doLogin
重新定义为

doLogin = (data, socket) => {
doLogin.bind(socket)
如果
doLogin
是arrow函数,则绑定(socket)将不起作用,因为无法绑定arrow函数。相反,它应该是一个常规函数:

function doLogin(data) {
  const socket = this;
  ...
}
...
socket.on('doLogin', doLogin.bind(socket));
doLogin.bind(socket)
如果
doLogin
是arrow函数,则绑定(socket)将不起作用,因为无法绑定arrow函数。相反,它应该是一个常规函数:

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