nodejs 中的回调函数callback的使用?

发布于 2022-09-05 15:37:30 字数 2346 浏览 40 评论 0

问一个已经存在的问题,只是我没有完全理解,原问题回调函数里面的callback不是很理解,求解释?

下面是原问题的代码:

//读取用户信息
function User(user) {
    this.name = user.name;
    this.password = user.password;
    this.email = user.email;
};

User.get = function(name, callback) {
    //打开数据库
    mongodb.open(function(err, db) {
        if (err) {
            return callback(err); //错误,返回 err 信息
        }
        //读取 users 集合
        db.collection('users', function(err, collection) {
            if (err) {
                mongodb.close();
                return callback(err); //错误,返回 err 信息
            }
            //查找用户名(name键)值为 name 一个文档
            collection.findOne({
                name: name
            }, function(err, user) {
                mongodb.close();
                if (err) {
                    return callback(err); //失败!返回 err 信息
                }
                callback(null, user); //成功!返回查询的用户信息
            });
        });
    });
};

函数调用

        User.get(newUser.name, function(err, user) {
            if (err) {
                req.flash('error', err);
                return res.redirect('/');
            }
            if (user) {
                req.flash('error', '用户已存在!');
                return res.redirect('/reg'); //返回注册页
            }
            //如果不存在则新增用户
            newUser.save(function(err, user) {
                if (err) {
                    req.flash('error', err);
                    return res.redirect('/reg'); //注册失败返回主册页
                }
                req.session.user = newUser; //用户信息存入 session
                req.flash('success', '注册成功!');
                res.redirect('/'); //注册成功后返回主页
            });
        });
    });

问题1 :User.get = function(name, callback){do something};此处的callback是node内置的吗?假如用户想要自定义带回调函数的函数,就必须使用callback作为自定义函数的参数?

问题2:下面代码中的callback(err);是把err传递给用户自定义的回调函数中了吗?
那么return callback(err);中的return有什么作用,我的印象中return是为了把返回的值给别人使用,那么在这里使用return 就是为了少写一个else吗?还是有其他的用途?

if (err) { 
    return callback(err); //失败!返回 err 信息
}
callback(null, user); 

谢谢你们啦!!希望有人回答我的疑问,如果我哪里理解错了,希望批评指正。
clipboard.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

少女七分熟 2022-09-12 15:37:32

答案1 callback不是内置的,是需要你调用User.get时传入的第二个参数,这个参数是一个function

就相当于你和朋友出去吃饭,饭店人很多要叫号,你朋友说,你先去逛街吧,我在店门口等叫号,叫到我们我就电话你,你朋友是这个callback。

答案2, return是为了跳出函数,否则if下面的正确分支callback(null, user); 就会被执行了

萌酱 2022-09-12 15:37:32

javascript 里最难理解的几个东西:

  1. 原型和原型链

  2. 上下文环境和作用域

  3. 异步编程和回调。

其中的 3 里的回调就是所谓的 callback,callback 并不是一个内置的函数,叫他 callback 只是一个约定俗成的习惯而已,顾名思义"call back",就是说「先等会儿,再说」。


所以,问题1,不是内置的。有些时候也会简写成 cb, 或者也有人会写成 func。

User.get = function(name, cb) {
  \\ do something
  cb()
  \\ do something
}

以及

User.get = function(name, func) {
  \\ do something
  func()
  \\ do something
}

问题2. 基本上是按你说的,就是少写了一个 else。同时如果这个回调函数返回了值的话,也可以更进一步的返回给外层函数(高阶函数)。


P.S. 说点题外话,callback 的存在其实是为了异步编程服务的。所以如果想要更深入的理解 callback 的话建议了解一下异步编程,另外 ES7 的写法已经基本摈弃了 callback 的用法,而改用 await/async 的写法了,也有使用 Promise 的写法。

如果还想往更深入了解的话,可以了解一下函数式编程(functional programming),更深入的话当然还有 lambda calculus,比如里面柯里化等等概念,这些都是函数式编程的理论基础。

情栀口红 2022-09-12 15:37:32

不一定把,参数名你随便起的吧callback你换个名字不就知道了

国际总奸 2022-09-12 15:37:32

1.不是。callback只是你定义函数的参数
2.有错误的时候直接执行callback返回,少写一个else

醉殇 2022-09-12 15:37:32

美如画的回掉函数...

  1. callback 不是内置的, 只是个参数名字而已可以用其他名字。
  2. 是的, return 为了退出函数,不运行下面的代码。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文