0

这个问题来自使用 Node.js 的 10gen MongoDB 类中的作业问题,但是,我并不是要您解决作业(关于 Mongo),而是要解释两个函数之间的关系。在 session.js 文件中,该方法在这样的数据对象模块addUser上调用users

      users.addUser(username, password, email, function(err, user) {
                "use strict";

                if (err) {
                    // this was a duplicate
                    if (err.code == '11000') {
                        errors['username_error'] = "Username already in use. Please choose another";
                        return res.render("signup", errors);
                    }
                    // this was a different error
                    else {
                        return next(err);
                    }
                }

                sessions.startSession(user['_id'], function(err, session_id) {
                    "use strict";

                    if (err) return next(err);

                    res.cookie('session', session_id);
                    return res.redirect('/welcome');
                });
            });

在用户数据对象模块中,有这样一个this.addUser函数

 this.addUser = function(username, password, email, callback) {
        "use strict";

        // Generate password hash
        var salt = bcrypt.genSaltSync();
        var password_hash = bcrypt.hashSync(password, salt);

        // Create user document
        var user = {'_id': username, 'password': password_hash};

        // Add email if set
        if (email != "") {
            user['email'] = email;
        }

        //node convention first arg to call back error, 2nd the actual data we're returning, callbackwith value if added user
        // look in session.js file that uses the UsersDAO to get a sense of how this is being used and
        // what type of callback is passed in.Task is to fill in code to add a user when one tries to signup

        // TODO: hw2.3

        callback(Error("addUser Not Yet Implemented!"), null);

    }

我们应该实现允许将用户添加到 mongo 数据库中的回调。我不是要你告诉我这些。相反, users.addUser 函数的第四个参数是一个回调函数function(err, user) { }。另外,这个this.addUser函数有callback第四个参数,所以users.addUser里面运行的回调函数this.addUser? 你能帮助澄清这两者之间的关系吗?我知道函数完成后会运行回调,但我不知道为什么将其传递给this.addUser

4

1 回答 1

1

so the callback function from users.addUser runs inside this.addUser?

这正是正在发生的事情。您可能已经知道,Javascript 将函数视为一等公民。这意味着您可以像其他类型一样传递和返回它们。函数之所以特殊,是因为它们的原型中有两个附加字段:它们运行的​​上下文和函数的代码。

在您的情况下,这是如何工作的:
1 - 在线上users.addUser(username, password, email, function(err, user) {...},您this.addUser使用第四个参数作为匿名函数进行调用。
2-this.addUser为这个匿名函数分配一个变量名,称之为回调
3- 在发生错误的情况下,使用错误对象Error("addUser Not Yet Implemented!")null参数执行回调(因为它是一个函数)。这些代表erruser在您的第一行中声明。


您可能熟悉的一个例子是setTimeout. 该函数定义为: var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);。该方法setTimeout并不真正关心func它是什么,只要它可以执行它。假设以下代码,例如:

var delay = 30 * 1000;
document.getElementById("foo").innerHTML = "This text will change in "+delay/1000+" sec";
setTimeout(function(){
  document.getElementById("foo").innerHTML = "told ya!";
}, delay);

在这里,我们再次传递了一个回调,它将在未来执行。一件很酷的事情是这个回调可以访问 的范围setTimeout,这意味着它可以使用该范围中定义的变量。在 的情况下setTimeout,这并不是真正有用,但是在您的 中this.addUser,您可以访问源自创建操作的错误对象。

有关回调如何工作的更多详细信息,请查看这两个 答案

于 2013-08-22T16:06:14.180 回答