编写自己的node.js回调的最佳实践是什么?

编写自己的node.js回调的最佳实践是什么?,node.js,callback,Node.js,Callback,我已经阅读了很多关于如何编写回调的教程。然而,这些都没有真正了解推荐的设计是什么 想象一下,这段代码使用虚拟查询函数通过虚拟数据库登录用户,使其保持简单,但仍可编译和运行: var db = {}; // fake query function for demonstration purposes db.query = function(query, cb) { console.log('Running an expensive query:', query); if (que

我已经阅读了很多关于如何编写回调的教程。然而,这些都没有真正了解推荐的设计是什么

想象一下,这段代码使用虚拟查询函数通过虚拟数据库登录用户,使其保持简单,但仍可编译和运行:

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
中的回调包装成
进程.nextTick()
调用? 还是有更好的办法

我感兴趣的是了解如何设计这两种回调:

  • 回调作为node.js库执行的另一个回调的一部分运行
  • 我自己的昂贵/复杂算法/操作

您应该根据约定设计所有节点回调:

var callback = function(err, data1, data2){
}
回调的第一个参数应该始终是可能发生的任何错误

无论是节点标准库的回调还是您自己的代码,都应该遵循此约定


如果遵循此约定,则可以使用async.js之类的库或其他依赖于此约定的库。域也依赖于此约定。

问题中的代码仅用于演示目的。但是在你的回复中,我注意到的是提到了async.js。async和下划线是两个库,在执行任何非平凡的node.js工作时都是必不可少的。