我已经阅读了很多关于如何编写回调的教程。但是,这些都没有真正融入推荐的设计中。
想象一下这段代码通过虚构的DB通过虚构的查询函数记录用户,以保持简单但仍可编译和运行:
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;
在这段代码中,我依靠数据库层以正确的异步方式处理query
函数的回调,以便在login
函数中自己的回调也被异步调用。
然而,这是我自己的回调的正确设计吗?我最好将db.query
中的回调换成process.nextTick()
来电吗?
或者还有更好的方法吗?
我感兴趣的是了解如何设计这两种类型的回调:
答案 0 :(得分:3)
您应该根据约定设计所有节点回调:
var callback = function(err, data1, data2){
}
回调的第一个参数应始终是可能发生的任何错误。
您应遵循此约定,无论它是节点标准库的回调还是您自己的代码。
如果遵循此约定,那么您将能够使用诸如async.js之类的库或依赖此约定的其他promises库。域也依赖于此约定。