AngularJS&Socket.IO – 从Service(发送到此处)到Controller的返回值是undefined || 承诺,asynchronous

我没有让我的代码正常工作。

我正在开发一个AngularJS应用程序,包括通过socket.io连接到后端服务器。 我正在开发一个用于将用户数据发送到服务器的login。 如果发送的数据是正确的(电子邮件和密码),服务器将用“有效”和用户数据(名称,date,出生…)作出响应。 要素是:

  • BackendService(执行发送到服务器的工厂)
  • AppController(调用BackendService的loginfunction的控制器)
  • Node.js服务器(计算发送的数据是否有效,以便用户可以login)

目的是在工厂的loginfunction返回一个“login代码”告诉控制器,如果login是正确的。 不幸的是该函数返回“未定义” 。 在我的研究中,我发现这可能是因为asynchronous性和承诺。 但是,我不能将给定的信息应用于我的问题,因为大部分是关于$ http。 另外 – 如果我的代码结构需要改进,请告诉我!

这是我的代码:

Node.js服务器

socket.on('logincust', function (p1, fn) { connection.query("SELECT Salt FROM Customer WHERE Email = ?", [p1.Email], function (err, data, fields) { if (err) { throw err; } if (data.length > 0) { var hash = crypto.createHash('sha256').update(p1.Password + data[0].Salt).digest('base64'); connection.query("SELECT LName,FName,Email,Telephone,Address,DateOfBirth FROM Customer WHERE Password = ?", [hash], function (err, data2, fields) { if (err) { throw err; } if (data2.length > 0) { fn('valid', data2[0]); } else { fn('invalidpassword', 'nodata') } }) } else { fn('invalidemail','nodata') } }) }) 

后端服务(工厂)

 "use strict"; mobileClientApp.factory('BackendService', function() { var mySocket = io.connect('http://thisLinkIsPrivate:8888/ns'); return { login: function (pUserData) { if (mySocket.connected) { mySocket.emit('logincust', pUserData, function (resp, data) { if (resp == "valid") { var parsedData = JSON.stringify(data); console.log(parsedData); user.lName = parsedData.LName; // Fill userData user.fName = parsedData.FName; user.email = parsedData.Email; user.phoneCallcenter = parsedData.Telephone; console.info("Login successful."); return 0; } else { if (resp == "invalidpassword") { return 1; } else if (resp == "invalidemail") { return 2; } } }); } else { // Socket is not connected console.warn("Socket not connected.); user.fName = "Peter"; user.lName = "Offline"; return -1; } }; 

angular度控制器

 $scope.doLogin = function() { var user = {'Email': this.loginData.username, 'Password': this.loginData.password}; var isLoggedIn = BackendService.login(user); // 0 - logged in, 1 - invalid password, 2 - invalid email, -1 - socket not connected console.log("BackendService.login(user): " + BackendService.login(user)); // is undefined! console.log("isLoggedIn: " + isLoggedIn); // undefined! if (isLoggedIn == 0 || isLoggedIn == -1) { $location.path('/app/landing'); } else { $scope.errorMessage = "Invalid login data!"; } }; 

是的,这个问题似乎是不同步的。 如果你想访问来自login方法的结果,你应该传递一个callback。 自从调用它之后,下一次执行将是您的控制台日志,并且会在您的SQL查询返回结果之前发生。