【发布时间】:2015-08-06 12:59:21
【问题描述】:
我有一段处理用户数据的代码。有一堆嵌套的函数调用:
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 的调用者没有等待它!
【问题讨论】:
-
是的,每个执行异步操作并使用承诺(即使只是有时)的函数都需要始终返回一个承诺。
标签: javascript asynchronous promise