У меня есть обучающая игра, использующая Angular, Express, Mongo и Node. Теперь я изучаю, как использовать обещания, поэтому я могу подождать, пока что-то не закончится, прежде чем начинать что-то еще.
Прямо сейчас, я пытаюсь подождать, пока база данных не сообщит, имеет ли пользователь, пытающийся войти в систему, учетную запись. Мне это удалось, поэтому, если пользователь не существует, то .then()
onReject
функцию onReject
, которая создаст пользователя.
user
имеет основную учетную запись и может воспроизводить сеансы. В течение каждой сессии он получит нового player
. Если user
существует и пытается войти в систему, и его player
зарегистрирован, он получит этого player
обратно. Если player
не существует, сервер создаст его для него.
Но у меня возникла проблема с logged
переменной, которая говорит, что у пользователя есть зарегистрированный player
. На второй строке функции findUser
, я создаю переменную logged
, и я пытаюсь вернуть его, так что я могу использовать на onResolve
функции.
UserModel.find(
{ username: username, password: password},
findUser ).then(
onResolve,
onReject );
По обещанию
var onResolve = function (logged) {
if (logged) {
//RETURN USER'S PLAYER
} else {
//CREATE USER'S PLAYER
}
}
На обещание отказаться
var onReject = function () {
userModel.save( function (err) {
if (!err) {
//CREATE USER
//CREATE USER'S PLAYER
}
});
});
Функция findUser
var findUser = function (err, data) {
var logged = false;
var userSearched = Q.defer();
if (data.length) { //IF USER IS IN DATABASE
logged = true;
userSearched.resolve(logged);
} else {
userSearched.reject(logged);
}
return userSearched.promise;
};
Как я могу вернуть logged
переменную из обещания использовать все, что мне нужно?
Если вы вернете значение из обработчика .then()
, это значение станет выполненным значением обещания.
var onResolve = function (logged) {
if (logged) {
//RETURN USER'S PLAYER
} else {
//CREATE USER'S PLAYER
}
// ** add this **
return logged;
}
Затем вы можете использовать его в последующих обработчиках .then()
:
UserModel.find({ username: username, password: password}, findUser)
.then( onResolve, onReject)
.then(function(result) {
// can access result here
});
Если этот код находится внутри функции, вы можете вернуть обещание от UserModel.find()
:
function someFunc() {
return UserModel.find({ username: username, password: password}, findUser)
.then( onResolve, onReject);
}
И затем добавьте обработчик .then()
к возвращенному обещанию.
someFunc().then(function(result) {
// access result here
});
Или, в вашей функции findUser()
:
var findUser = function (err, data) {
var userSearched = Q.defer();
if (data.length) { //IF USER IS IN DATABASE
userSearched.resolve(true);
} else {
userSearched.reject(false);
}
return userSearched.promise;
};
findUser.then(function(val) {
// access resolved value here
}, function(err) {
// access rejected reason here
});
Хотя findUser()
не выглядит асинхронным, поэтому я не понимаю, почему вы вообще используете обещание. Кажется, вы можете просто вернуть true
или false
из функции напрямую.
logged
за пределами обещания. Вместо этого верните обещание и используйте его там, где вам нужноlogged
.