在外部控制器客户端

时间:2017-05-31 14:29:24

标签: javascript node.js socket.io

我有以下问题。我想将所有socket.emit函数从客户端分离到一个单独的控制器类中,这样我就可以调用Controller函数并接收响应:

应用/组件/ client.js

let response = NodeController.root(path);
console.log('response', response);
if(response){
    var projectInfoId = JSON.parse(response);
}

应用程序/控制器/节点controller.js

class NodeController {
    static root(data){
        let tmp;
        socket.emit('/', data, function (response) {
            tmp = response;
        });
        return tmp;
    }
}

client.js中的projectInfoId将是未定义的,因为响应未定义。如果我直接在客户端使用回调函数调用socket.emit(),我将收到数据,而我的projectInfoId将包含一些内容。

是否可以从client.js代码中分离套接字函数,或者我是否必须直接在client.js文件中调用它?

1 个答案:

答案 0 :(得分:1)

这是尝试在异步函数上使用return的典型情况。正确的方法是在你的根函数上添加一个回调,如下所示:

    let response = NodeController.root(path, function(response){
  console.log('response', response);
    if(response){
        var projectInfoId = JSON.parse(response);
    }
});

然后像这样使用它:

Button

还有一些其他方法可以处理异步功能。其中一个是async.js npm模块(是的,它可以在客户端上工作),使用函数生成器甚至使用promises。