我有以下问题。我想将所有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文件中调用它?
答案 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。