【问题标题】:What is the best practice to write own node.js callbacks?编写自己的 node.js 回调的最佳实践是什么?
【发布时间】: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 库执行的另一个回调的一部分运行
  • 我自己的昂贵/复杂的算法/操作

【问题讨论】:

    标签: node.js callback


    【解决方案1】:

    你应该按照约定来设计所有的节点回调:

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

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

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

    如果您遵循此约定,那么您将能够使用诸如 async.js 之类的库或其他依赖此约定的 Promise 库。域也依赖此约定。

    【讨论】:

    • 问题中的代码仅用于演示目的。但是让我注意到你的回复是提到了 async.js。会检查一下。
    • async 和 underscore 是 2 个库,在进行任何非平凡的 node.js 工作时都是必不可少的。
    猜你喜欢
    • 2019-01-25
    • 1970-01-01
    • 2023-03-14
    • 2014-01-22
    • 2014-01-18
    • 2011-02-13
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    相关资源
    最近更新 更多