[英]AngularJS & Socket.IO - Return value from Service (emit here) to Controller is undefined || promises, asynchronicity
我沒有使我的代碼正常工作。
我正在使用AngularJS開發一個應用程序,其中包括通過socket.io與后端服務器的連接。 我正在使用登錄名,該登錄名旨在將用戶的數據發送到服務器。 如果發送的數據正確(電子郵件和密碼),則服務器將以“有效”和用戶數據(名稱,dateOfBirth等)進行響應。 元素是:
目的是使工廠中的登錄功能返回一個“登錄代碼”,該代碼告訴控制器登錄是否正確。 不幸的是,該函數返回“ undefined” 。 在研究過程中,我發現這可能是由於異步性和承諾。 但是,我無法將給定的信息應用於我的問題,因為大多數都是關於$ 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')
}
})
})
BackendService(工廠)
"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;
}
};
角度控制器
$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!";
}
};
是的,問題似乎是異步的。 如果要訪問登錄方法的結果,則應向其傳遞回調。 由於調用后,下一次執行將是控制台日志,並且將在SQL查詢返回結果之前進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.