【发布时间】:2013-07-04 17:07:41
【问题描述】:
我已经阅读了很多关于如何编写回调的教程。然而,这些都没有真正符合推荐的设计。
想象一下这段代码,它通过虚构的数据库登录用户,并带有虚构的查询功能,以保持简单但仍然可编译和可运行:
var db = {};
// fake query function for demonstration purposes
db.query = function(query, cb) {
console.log('Running an expensive query:', query);
if (query == 'get uid from db')
return cb(null, {password: 'pwd'});
return cb(null, {password: 'pass'});
}
var login = function(user, password, cb) {
var q = 'get ' + user + ' from db';
db.query(q, function(err, user) {
if (err || !user || user.password != password)
return cb(false);
return cb(true);
});
};
console.log('pre');
login('uid', 'pwd', function(success) {
console.log('Login', success ? 'was successful' : 'failed');
});
console.log('post');
module.exports = null;
在这段代码中,我依靠 DB 层以正确的异步方式处理 query 函数的回调,以便我自己在 login 函数中的回调也被异步调用。
但是,这是我自己的回调的正确设计吗?我最好将db.query 中的回调封装到process.nextTick() 调用中吗?
还是有更好的办法?
我感兴趣的是了解如何设计这两种类型的回调:
- 回调作为由 node.js 库执行的另一个回调的一部分运行
- 我自己的昂贵/复杂的算法/操作
【问题讨论】: