У меня есть диалоговое окно регистрации, в котором, когда пользователь вводит имя пользователя и пароль, мне нужно проверить базу данных, присутствует ли пользователь или нет. Но когда я проверяю на то же самое, мой вызов не сдерживается, пока я не получу результаты с сервера.
После того, как я искал какое-то время, я узнал о callbacks
. Поэтому я добавил вызов внутри this.isUser
метода. И это успешно. Но теперь метод doRegistration
не является синхронным с методом isUser
.
Как сделать все мои вызовы синхронными?
this.doRegistration = function(uname, pwd, confirmPwd) {
if(this.isUser(uname)) {
return "USER_EXISTS";
} else {
saveUser(uname, pwd);
return "SUCCESS";
}
};
this.isUser = function(username) {
var users = new Array();
getAllUsers('param', function(response) {
users = response;
console.log(users.length);
for(i = 0; i < users.length; i++) {
if(users[i].username === username) {
return true;
}
}
return false;
});
};
function getAllUsers(param, callback) {
loginFactory.AllUsers.query(function(response) {
if(response != undefined && response.length > 0) {
callback(response);
}
});
}
Вы можете переписать код следующим образом:
this.doRegistration = function(uname, pwd, confirmPwd, callBack) {
this.isUser(uname,function(flag) {
if(flag){
callBack("USER_EXISTS");
}
else {
saveUser(uname, pwd, function(err,result){
if(err){
callBack("SAVING_FAILED");
}
else {
callBack("SUCCESS");
}
});
}
});
};
this.isUser = function(username,callBack) {
var users = new Array();
getAllUsers('param', function(response) {
users = response;
console.log(users.length);
for(i = 0; i < users.length; i++) {
if(users[i].username === username) {
callBack(true);
}
}
callBack(false);
});
};
function saveUser(userName, pwd, callBack){
//code to save user
//chek for error in saving
if(err){
callBack(err,null)
}
else {
callBack(null, "success")
}
}
function getAllUsers(param, callback) {
loginFactory.AllUsers.query(function(response) {
if(response != undefined && response.length > 0) {
callback(response);
}
});
}
Вы также можете определить saveUser как функцию с обратным вызовом. Здесь он не ждет завершения метода saveUser.