I am implementing Node.js logic with controllers and repository using Kris Kowal's Q library. I have a feeling that the way I use promises in the example below is not correct. But I can't find any guidance on proper pattern how to use promises through multiple layers or functions.
Am I doing it right? What's the proper way implementing this logic?
// Module: Repository
exports.findOne = function (query) {
var deferred = Q.defer();
db.query(query, function (err, data) {
if (err) {
deferred.reject(err);
} else {
deferred.resolve(data);
}
});
return deferred.promise;
};
// Module: User
var isEmailAvailable = function (value) {
var deferred = Q.defer();
Repository.findOne({email: value})
.then(function (user) {
if (user) {
if (self.id === user.id) {
deferred.resolve(true);
}
else {
deferred.resolve(false);
}
} else {
deferred.resolve(true);
}
})
.fail(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
this.save = function () {
var deferred = Q.defer();
isEmailAvailable(this.email)
.then(function (result) {
if (result) {
Repository.upsert(self)
.then(function (user) {
deferred.resolve(user); //--- Yey!!!
}).fail(function () {
deferred.reject('Account save error')
});
} else {
deferred.reject('The email is already in use');
}
}).fail(function () {
deferred.reject('Account validation error')
});
return deferred.promise;
};