Promise化后代码 回调地狱解决了一些。组织起来也更流畅了。 下面举一个最小例子。
原来代码:
userDao.findById = function (userId,callback) {
var sql = 'select * from user where user_id = ?';
var args = [userId];
mysql.query(sql, args, function (err, users) {
callback(err,users);
})
}
原来的调用
userDao.findById(1234, function (err, users) {
if(!users.length < 1){
return callback(new Error('用户不存在'))
}
var user = users[0];
userDao.updateScoreByUser(user.user_id, function (err, result) {
// ...
// 可能继续回调嵌套
})
})
函数 Promise 化后
userDao.findById = function (userId) {
var sql = 'select * from user where user_id = ?';
var args = [userId];
return new Promise(function (fulfill, reject) {
mysql.query(sql, args, function (err, users) {
if (err) {
debug(err);
return reject(err);
}
fulfill(users[0]);
})
});
}
使用:
userDao.findById(1234)
.then(function (uers) {
if(users.length < 1){
throw new Error('用户不存在');
}
var user = users[0];
return userDao.updateUserScore(user.user_id);
})
.then(function (updateResult) {
// todo ...
})
.then(function (continueResult) {
// 如果还有回调查询,继续 返回Promise ,然后 .then .then .then...
})
.catch(function (err) {
// 会捕捉 throw 的 error
})
9 回复