回调函数里面的callback不是很理解,求解释?

代码用于查数据库,采用express框架。不是很理解get方法里面的callback,该函数返回值是什么?callback(null, user);这里为什么第一个参数是null?感觉JS回调自己理解的不是很清楚

//读取用户信息
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('/'); //注册成功后返回主页
            });
        });
    });
阅读 6.8k
3 个回答

callback只是一个普通的函数,叫回调是因为它一般是在传入的函数运行结束时被调用

该函数返回值是什么?

看你传进来的callback是什么

callback(null, user);这里为什么第一个参数是null?

如果有错,第一个是参数是错误,否则是nullcallback函数通过检查第一个返回值来判断是否出错

一个无聊的例子


function fa(a, callback) {
    if (a == 1) {
        fb(3, callback);
    } else {
        callback("err: a != 1");
    }
}
function fb(b, callback) {
    if (b === 3) {
        callback("err: b == 3");
    } else {
        callback(null, "b != 3");
    }
}

fa(1, function (err, res) {
  if (err) {
    console.error(err);
  } else {
    console.log("success");
    console.log(res);
  }
});

输出为

err: b == 3

您好,callback函数是回调函数,顾名思义,他是在异步操作完成之后才被调用的。一般情况是不需要返回值的,只需要处理异步操作结束后的逻辑,作为handler。
至于为什么是null,这是回调函数的一条基本准则,为了规范其使用,我们约定callback的第一个参数为err(即异步操作内的异常错误等),第二个为处理的结果,当err===null时,即没有在异步操作中发生错误(异常)。


不如换成Promise或者Async等风格的异步风格。

callback就是 User.get(newUser.name, function(err, user) {...})中的function(err, user) {...}这一段。第一个参数是err(error,错误),第二个参数是user。

所以,
callback(null, user)中的null就是说,err 是null,就是没有错误,也就是成功了;
callback(err) 则是有错误。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏