Javascript Q promise.then()未定义

Javascript Q promise.then()未定义,javascript,node.js,q,Javascript,Node.js,Q,我尝试从MySQL数据库异步提取数据,然后使用Q promise处理结果(有史以来第一次尝试)。我正在使用列出的Q defer()函数。我已经创建了一个“包装器”对象,我将最终附加到req.db,或者通过com.db的循环依赖项访问(当前的使用方式),以便在我的应用程序中使用api 节点抛出指向的错误。然后回调: this.go().then(function(stuff){ ^ TypeError: Cannot call method 't

我尝试从MySQL数据库异步提取数据,然后使用Q promise处理结果(有史以来第一次尝试)。我正在使用列出的Q defer()函数。我已经创建了一个“包装器”对象,我将最终附加到req.db,或者通过com.db的循环依赖项访问(当前的使用方式),以便在我的应用程序中使用api

节点抛出指向的错误。然后回调:

this.go().then(function(stuff){
                          ^
TypeError: Cannot call method 'then' of undefined
我尝试了以下方法:

var com = require('./mainRebuild');

function Base() {
    this.results = [];
    this.query = 'query here';
    this.go = function() {

        com.pool.getConnection(function(err, con) {

            if (err) throw err;
            /*
            THIS WORKS FINE (with callbacks)
             con.query('SELECT * FROM Users', function(err, rows){
                if (err) throw err;
                if (rows){

                  for (var i = 0; i < rows.length; i++){
                    this.results.push(rows[i]);
                    //console.log(rows[i]);
                  }
                }
                con.release();
                return this.results;
              }.bind(this));

              */
            var defer = com.Q.defer();
            con.query('SELECT * FROM Users', defer.makeNodeResolver());
            return defer.promise();
        }.bind(this));
    }
}

function DB() {
    this.getAllUsers = function() {
        this.query = 'SELECT * FROM Users';
        this.go().then(function(stuff) {
            console.log(stuff);
        }, function(err) {
            console.log(err);
        });
    }

}

DB.prototype = new Base();

module.exports = DB;

我发现了几篇关于将Q调整为节点的文章,比如。

类似这样的东西应该可以做到(“应该”,因为我没有办法用MySQL测试它)

用法:

var DB = require('./DB');
var com = require('./mainRebuild');
var db = new DB(com.pool);

db.getAllUsers().then(function (users) {
    console.log(users);
});

db.getUserByName('JohnDoe').then(function (user) {
    console.log(user);
});

var customQuery = db.asyncQuery('SELECT * FROM foo WHERE id = ?');
customQuery(42).then(function (result) {
    console.log(result);
});

像这样的东西应该可以做到(“应该”,因为我没有办法用MySQL测试它)

用法:

var DB = require('./DB');
var com = require('./mainRebuild');
var db = new DB(com.pool);

db.getAllUsers().then(function (users) {
    console.log(users);
});

db.getUserByName('JohnDoe').then(function (user) {
    console.log(user);
});

var customQuery = db.asyncQuery('SELECT * FROM foo WHERE id = ?');
customQuery(42).then(function (result) {
    console.log(result);
});

像这样的东西应该可以做到(“应该”,因为我没有办法用MySQL测试它)

用法:

var DB = require('./DB');
var com = require('./mainRebuild');
var db = new DB(com.pool);

db.getAllUsers().then(function (users) {
    console.log(users);
});

db.getUserByName('JohnDoe').then(function (user) {
    console.log(user);
});

var customQuery = db.asyncQuery('SELECT * FROM foo WHERE id = ?');
customQuery(42).then(function (result) {
    console.log(result);
});

像这样的东西应该可以做到(“应该”,因为我没有办法用MySQL测试它)

用法:

var DB = require('./DB');
var com = require('./mainRebuild');
var db = new DB(com.pool);

db.getAllUsers().then(function (users) {
    console.log(users);
});

db.getUserByName('JohnDoe').then(function (user) {
    console.log(user);
});

var customQuery = db.asyncQuery('SELECT * FROM foo WHERE id = ?');
customQuery(42).then(function (result) {
    console.log(result);
});



this.go
没有返回任何东西……我想我只是对我试图编写的嵌套延迟函数感到困惑。您能解释一下如何使这个.go返回嵌套的延迟吗?在
go
中创建承诺,而不是在回调中创建承诺。下面是一个简化的示例:
函数foo(){function bar(){return 42;};bar();}
。你希望
foo()
真的返回
42
返回defer.promise()
应该是
返回defer.promise是的,将defer放在回调之外,然后返回foo,效果非常好。还有
延迟.承诺
。有人请写下答案,我会接受的!谢谢大家
this.go
不会返回任何东西……我想我只是对我试图编写的嵌套延迟函数感到困惑。您能解释一下如何使这个.go返回嵌套的延迟吗?在
go
中创建承诺,而不是在回调中创建承诺。下面是一个简化的示例:
函数foo(){function bar(){return 42;};bar();}
。你希望
foo()
真的返回
42
返回defer.promise()
应该是
返回defer.promise是的,将defer放在回调之外,然后返回foo,效果非常好。还有
延迟.承诺
。有人请写下答案,我会接受的!谢谢大家
this.go
不会返回任何东西……我想我只是对我试图编写的嵌套延迟函数感到困惑。您能解释一下如何使这个.go返回嵌套的延迟吗?在
go
中创建承诺,而不是在回调中创建承诺。下面是一个简化的示例:
函数foo(){function bar(){return 42;};bar();}
。你希望
foo()
真的返回
42
返回defer.promise()
应该是
返回defer.promise是的,将defer放在回调之外,然后返回foo,效果非常好。还有
延迟.承诺
。有人请写下答案,我会接受的!谢谢大家
this.go
不会返回任何东西……我想我只是对我试图编写的嵌套延迟函数感到困惑。您能解释一下如何使这个.go返回嵌套的延迟吗?在
go
中创建承诺,而不是在回调中创建承诺。下面是一个简化的示例:
函数foo(){function bar(){return 42;};bar();}
。你希望
foo()
真的返回
42
返回defer.promise()
应该是
返回defer.promise是的,将defer放在回调之外,然后返回foo,效果非常好。还有
延迟.承诺
。有人请写下答案,我会接受的!谢谢大家!美丽的。将工厂函数添加到module.exports并返回新的DB()允许导出的对象完全可链接:D.g.
module.exports=createApp;函数createApp(){return new DB();}
另请参见修改后的答案。
DB
的定义不需要知道
pool
是在
'./mainRebuild'
中定义的。我们可以注入它。有没有理由不从
'./mainRebuild'
导入依赖项?注入是否更可取,它的优越性如何?好吧,使用哪种连接与您的DB适配器无关。理论上,您可以拥有多个数据库或连接池,将池传递给DB构造函数允许这种模式。这不是很危险吗?很漂亮。将工厂函数添加到module.exports并返回新的DB()允许导出的对象完全可链接:D.g.
module.exports=createApp;函数createApp(){return new DB();}
另请参见修改后的答案。
DB
的定义不需要知道
pool
是在
'./mainRebuild'
中定义的。我们可以注入它。有没有理由不从
'./mainRebuild'
导入依赖项?注入是否更可取,它的优越性如何?好吧,使用哪种连接与您的DB适配器无关。理论上,您可以拥有多个数据库或连接池,将池传递给DB构造函数允许这种模式。这不是很危险吗?很漂亮。将工厂函数添加到module.exports并返回新的DB()允许导出的对象完全可链接:D.g.
module.exports=createApp;函数createApp(){return new DB();}
另请参见修改后的答案。
DB
的定义不需要知道
pool
是在
'./mainRebuild'
中定义的。我们可以注入它。有没有理由不从
'./mainRebuild'
导入依赖项?注入更可取吗,它有多优越?好吧,这不是你的DB适配器的共同点