编写自己的node.jscallback函数的最佳做法是什么?

我已经阅读了许多关于如何编写callback的教程。 但是,这些都不能真正推荐推荐的devise。

想象一下这样一段代码,它通过假想的查询函数通过虚构的数据库login用户,以保持简单,但仍然可以编译和运行:

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; 

在这段代码中,我依靠数据库层以正确的asynchronous方式处理query函数的callback,以便我自己在login函数中的callback也被asynchronous调用。

但是,这是我自己的callback正确的devise? 我应该更好地将db.query的callback包装到process.nextTick()调用中吗? 还是有更好的办法?

我感兴趣的是了解如何devise这两种callback:

  • callback作为由node.js库执行的另一个callback的一部分运行
  • 我自己的昂贵/复杂的algorithm/操作

您应该按照约定devise所有节点callback:

 var callback = function(err, data1, data2){ } 

callback的第一个参数应该始终是可能发生的任何错误。

无论是节点标准库还是自己的代码callback,都应该遵循这个约定。

如果你遵循这个约定,那么你将能够使用库,如async.js或依赖这个约定的其他承诺库。 域也依赖于这个约定。