У меня есть фрагмент кода, который обрабатывает данные пользователя. Есть куча вложенных вызовов функции:Как обещает работать с вложенными вызовами функций
f1(){
f2(){
....
fn{
///
}
}
}
fn
обращается к базе данных, что означает, что это асинхронный, так что я написал это как-то, что она возвращает promise
и в fn-1
(функция, которая вызывает fn
), мы используем .then()
ждать за это обещание. Но похоже, что я должен вернуть обещание в fn-1
и так далее. Это правда ?
var keyValueExists = function(key, value) {
var query = {};
query[key] = value;
return new Promise(function(resolve, reject) {
User.count(query, function(err, count) {
if (err) {
console.log(err);
console.log('Problem with `.find` function');
reject('Problem with `.find` function');
} else {
resolve(count !== 0);
}
});
});
};
var addUser = function(newUserInfo) {
var validationResult = Common._validateUserInfo(newUserInfo);
if (validationResult.isOK) {
keyValueExists('userName', newUserInfo.userName).then(function(userNameAlreadyExists) {
if (userNameAlreadyExists) {
validationResult = {
isOK: false,
reason: 'Username already exists',
infoWithBadInput: 'userName'
}
} else {
var newUserId = generateUserId();
//TODO: change it somehting more flexible. e.g. a predefined list of attributes to iterate over
var newUser = {
'userName': newUserInfo.userName,
'password': newUserInfo.password,
'userId': newUserId,
'lastModificationTime': Common.getCurrentFormanttedTime(),
'createdTime': Common.getCurrentFormanttedTime()
};
var user = new User(newUser);
user.save(function(err) {
if (err) {
console.log(err);
console.log('There is a problem saving the user info');
} else {
console.log('A new user added: ');
console.log(newUser);
}
});
}
return validationResult;
});
} else {
return validationResult;
}
};
addUser возвращает undefined
! Похоже, что вызывающий абонент addUser
не ждет его!
Да, каждая функция, которая делает что-то асинхронную и использует обещания (хотя бы иногда) должен всегда возвращать обещание. – Bergi