0

この質問は、Node.js を使用する 10 世代の MongoDB クラスの宿題の質問から生じていますが、宿題 (Mongo に関するもの) を解決するように求めているのではなく、2 つの関数間の関係を説明するよう求めているのではありません。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 関数の 4 番目の引数はコールバック関数function(err, user) { }です。また、このthis.addUser関数はcallback4 番目のパラメーターとして を持っているため、users.addUser内部で からのコールバック関数が実行されthis.addUser? ます。この 2 つの関係を明確にするのに役立ちますか? 関数が終了したときにコールバックが実行されることは知っていますが、なぜそれが渡されているのかわかりませんthis.addUser

4

1 に答える 1

1

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

それがまさに起こっていることです。おそらく既にご存じのとおり、Javascript は関数を第一級市民として扱います。これは、他のタイプと同じように、それらを渡したり返したりできることを意味します。関数は、プロトタイプに 2 つの追加フィールド (関数が実行されるコンテキストと関数のコード) があるため、特別です。

あなたの場合、
これがどのように機能するかはusers.addUser(username, password, email, function(err, user) {...}のとおりです。 2-この無名関数に変数名を割り当て、callbackを呼び出します。 3- エラーの場合、(関数であるため) コールバックがエラー オブジェクトとパラメータとして実行されます。これらはandを表し、最初の行で宣言されています。this.addUser
this.addUser
Error("addUser Not Yet Implemented!")nullerruser


あなたがおそらくよく知っている例は、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);

ここでも、将来実行されるコールバックを渡しています。クールな点の 1 つは、このコールバックが のスコープにアクセスsetTimeoutできることです。つまり、そのスコープで定義された変数を使用できます。の場合setTimeout、これはあまり役に立ちませんがthis.addUser、作成操作で発生したエラー オブジェクトにアクセスできます。

コールバックの仕組みの詳細については、次の2 つの 回答をご覧ください。

于 2013-08-22T16:06:14.180 に答える