0

ユーザークラスの一部であるこのコードがあります。この関数を呼び出すと:

user = new User();
user.regUser("john", "john@doe.com", "john123", function() { });

エラーが発生します

Uncaught TypeError: Object #<Database> has no method 'writeDb'

ユーザークラスの関数:

User.prototype.regUser = function(name, email, password, cb) {
        this.db.exec("SELECT * from users WHERE user_email='"+email+"';", function(results) {
            var len = results.rows.length;
            if (typeof(cb) == 'function') {
                if (len < 1) {

                    this.name = name;
                    this.email = email;
                    this.password = password;
                    this.writeDb();

                    cb(true); // username doesn't exists

                } else {
                    cb(false); // username already exists
                }
            }
        });
    }

問題は、'this'変数が私の関数の入れ子関数で呼び出されることでしょうか?他の関数ではネストされていないときに動作するためです。どうすればこれを修正できますか?

  • 少し編集:this.db.writeDb()を作成しました。これはthis.writeDb()である必要がありますが、それでもエラーが発生します。
4

1 に答える 1

2

「this」オブジェクトはコールバックのUserクラスであると想定していました。「this」オブジェクトをキャプチャするためにクロージャ変数を宣言するだけです。これを試して;

User.prototype.regUser = function(name, email, password, cb) {
      var user = this;
      user.db.exec("SELECT * from users WHERE user_email='"+email+"';",   function(results) {
        var len = results.rows.length;
        if (typeof(cb) == 'function') {
            if (len < 1) {

                user.name = name;
                user.email = email;
                user.password = password;
                user.db.writeDb();

                cb(true); // username doesn't exists

            } else {
                cb(false); // username already exists
            }
        }
    });
}
于 2012-10-23T15:04:52.550 に答える